python multiprocessing lock锁在相同父进程ID起作用

news2024/10/28 19:18:22

python多进程之间实现数据共享需要使用queue队列,全局变量不起作用
lock锁在同一个主进程ID下子进程ID之间起作用,不同的主进程ID互不干扰
下面来看代码

import multiprocessing,time,datetime
a=1
def demo1():
    global a
    a+=1
    print('进程1',a,datetime.datetime.now())
def demo2():
    time.sleep(2)
    print('进程2',a,datetime.datetime.now())

def demo3():
    print('开始执行进程3')
    lock.acquire()
    for i in range(5):
        time.sleep(2)
        q.put(i)
    lock.release()
    print('进程3',datetime.datetime.now())
def demo4():
    print('开始执行进程4')
    time.sleep(1)
    while not q.empty():
        print('进程4获取值:',q.get())
    time.sleep(2)
    print('进程4',datetime.datetime.now())

q=multiprocessing.Queue()
lock=multiprocessing.Lock()
multiprocessing.Process(target=demo1).start()
multiprocessing.Process(target=demo2).start()
multiprocessing.Process(target=demo3).start()
multiprocessing.Process(target=demo4).start()

运行结果

(python38) [root@mysql01 dtask]# python 2.py 
开始执行进程3
开始执行进程4
进程1 2 2024-10-25 15:29:38.662167
进程2 1 2024-10-25 15:29:40.662385
进程4 2024-10-25 15:29:41.666102
进程3 2024-10-25 15:29:48.670803

可以看到进程1结果是2 进程2结果是1
进程2还可以延迟,global在这个里面没有起效果
然后进程3和进程4 lock锁只对进程3有作用,并没有对进程4有任何作用,因为进程4无需持有锁,所以不受锁干扰
下面单独写一个进程

import multiprocessing,time,datetime,os

def demo():
    time.sleep(1)
    print('执行时间:',datetime.datetime.now(),f'子进程名字:{multiprocessing.current_process().name},当前进程ID:{os.getpid()},父进程ID:{os.getppid()}')

q=multiprocessing.Queue()
t=[]
lock=multiprocessing.Lock()
for i in range(10):
    t.append(multiprocessing.Process(target=demo,name=f'进程{i}'))

for i in t:
    i.start()

可以看到运行之后基本都是并发执行,这也是多进程效果更

(python38) [root@mysql01 dtask]# python 2.py 
执行时间: 2024-10-25 15:44:45.548511 子进程名字:进程5,当前进程ID:7678,父进程ID:7672
执行时间: 2024-10-25 15:44:45.549113 子进程名字:进程6,当前进程ID:7679,父进程ID:7672
执行时间: 2024-10-25 15:44:45.549570 子进程名字:进程1,当前进程ID:7674,父进程ID:7672
执行时间: 2024-10-25 15:44:45.549994 子进程名字:进程2,当前进程ID:7675,父进程ID:7672
执行时间: 2024-10-25 15:44:45.550426 子进程名字:进程3,当前进程ID:7676,父进程ID:7672
执行时间: 2024-10-25 15:44:45.550839 子进程名字:进程7,当前进程ID:7680,父进程ID:7672
执行时间: 2024-10-25 15:44:45.551425 子进程名字:进程8,当前进程ID:7681,父进程ID:7672
执行时间: 2024-10-25 15:44:45.551954 子进程名字:进程9,当前进程ID:7682,父进程ID:7672
执行时间: 2024-10-25 15:44:45.552496 子进程名字:进程4,当前进程ID:7677,父进程ID:7672
执行时间: 2024-10-25 15:44:45.553263 子进程名字:进程0,当前进程ID:7673,父进程ID:7672
(python38) [root@mysql01 dtask]# python 2.py 
执行时间: 2024-10-25 15:44:49.854005 子进程名字:进程5,当前进程ID:7692,父进程ID:7686
执行时间: 2024-10-25 15:44:49.854485 子进程名字:进程6,当前进程ID:7693,父进程ID:7686
执行时间: 2024-10-25 15:44:49.854808 子进程名字:进程1,当前进程ID:7688,父进程ID:7686
执行时间: 2024-10-25 15:44:49.855316 子进程名字:进程2,当前进程ID:7689,父进程ID:7686
执行时间: 2024-10-25 15:44:49.855698 子进程名字:进程3,当前进程ID:7690,父进程ID:7686
执行时间: 2024-10-25 15:44:49.856247 子进程名字:进程7,当前进程ID:7694,父进程ID:7686
执行时间: 2024-10-25 15:44:49.856574 子进程名字:进程8,当前进程ID:7695,父进程ID:7686
执行时间: 2024-10-25 15:44:49.857254 子进程名字:进程9,当前进程ID:7696,父进程ID:7686
执行时间: 2024-10-25 15:44:49.857582 子进程名字:进程4,当前进程ID:7691,父进程ID:7686
执行时间: 2024-10-25 15:44:49.858258 子进程名字:进程0,当前进程ID:7687,父进程ID:7686

下面采用lock

import multiprocessing,time,datetime,os

def demo():
    lock.acquire()
    time.sleep(1)
    print('执行时间:',datetime.datetime.now(),f'子进程名字:{multiprocessing.current_process().name},当前进程ID:{os.getpid()},父进程ID:{os.getppid()}')
    lock.release()

q=multiprocessing.Queue()
t=[]
lock=multiprocessing.Lock()
for i in range(10):
    t.append(multiprocessing.Process(target=demo,name=f'进程{i}'))

for i in t:
    i.start()

运行结果:

python38) [root@mysql01 dtask]# python 2.py 
执行时间: 2024-10-25 15:46:15.888807 子进程名字:进程5,当前进程ID:7789,父进程ID:7783
执行时间: 2024-10-25 15:46:16.889815 子进程名字:进程6,当前进程ID:7790,父进程ID:7783
执行时间: 2024-10-25 15:46:17.891551 子进程名字:进程1,当前进程ID:7785,父进程ID:7783
执行时间: 2024-10-25 15:46:18.893307 子进程名字:进程2,当前进程ID:7786,父进程ID:7783
执行时间: 2024-10-25 15:46:19.895166 子进程名字:进程3,当前进程ID:7787,父进程ID:7783
执行时间: 2024-10-25 15:46:20.896928 子进程名字:进程7,当前进程ID:7791,父进程ID:7783
执行时间: 2024-10-25 15:46:21.898912 子进程名字:进程8,当前进程ID:7792,父进程ID:7783
执行时间: 2024-10-25 15:46:22.900966 子进程名字:进程9,当前进程ID:7793,父进程ID:7783
执行时间: 2024-10-25 15:46:23.902843 子进程名字:进程4,当前进程ID:7788,父进程ID:7783
执行时间: 2024-10-25 15:46:24.904852 子进程名字:进程0,当前进程ID:7784,父进程ID:7783

可以看到时间都是相差一秒顺序执行所以没问题
看一个不同函数名获取lock的

import multiprocessing,time,datetime,os

def demo():
    lock.acquire()
    time.sleep(1)
    q.put(1)
    print('执行时间:',datetime.datetime.now(),f'子进程名字:{multiprocessing.current_process().name},当前进程ID:{os.getpid()},父进程ID:{os.getppid()}')
    lock.release()

def demo2():
    lock.acquire()
    time.sleep(1)
    q.put(2)
    print('执行时间:',datetime.datetime.now(),f'子进程名字:{multiprocessing.current_process().name},当前进程ID:{os.getpid()},父进程ID:{os.getppid()}')
    lock.release()

q=multiprocessing.Queue()
t=[]
lock=multiprocessing.Lock()
t.append(multiprocessing.Process(target=demo,name=f'进程1'))
t.append(multiprocessing.Process(target=demo2,name=f'进程2'))

for i in t:
    i.start()
for i in t:
    i.join()
while not q.empty():
    print('q的值:',q.get())

运行结果:

(python38) [root@mysql01 dtask]# python 2.py 
执行时间: 2024-10-25 15:55:21.224533 子进程名字:进程2,当前进程ID:8403,父进程ID:8401
执行时间: 2024-10-25 15:55:22.226918 子进程名字:进程1,当前进程ID:8402,父进程ID:8401
q的值: 2
q的值: 1

修改下代码:

import multiprocessing,time,datetime,os

def demo():
    lock.acquire()
    time.sleep(1)
    q.put(1)
    print('执行时间:',datetime.datetime.now(),f'子进程名字:{multiprocessing.current_process().name},当前进程ID:{os.getpid()},父进程ID:{os.getppid()}')
    lock.release()

def demo2():
    # lock.acquire()
    time.sleep(1)
    q.put(2)
    print('执行时间:',datetime.datetime.now(),f'子进程名字:{multiprocessing.current_process().name},当前进程ID:{os.getpid()},父进程ID:{os.getppid()}')
    # lock.release()

q=multiprocessing.Queue()
t=[]
lock=multiprocessing.Lock()
t.append(multiprocessing.Process(target=demo,name=f'进程1'))
t.append(multiprocessing.Process(target=demo2,name=f'进程2'))

for i in t:
    i.start()
for i in t:
    i.join()
while not q.empty():
    print('q的值:',q.get())

结果:

(python38) [root@mysql01 dtask]# python 2.py 
执行时间: 2024-10-25 15:57:27.649754 子进程名字:进程1,当前进程ID:8534,父进程ID:8533
执行时间: 2024-10-25 15:57:27.651128 子进程名字:进程2,当前进程ID:8535,父进程ID:8533
q的值: 1
q的值: 2

可以看到lock锁对在同一个父进程ID,会起到锁的作用
接下来我们建一个1.py脚本
脚本内容

import multiprocessing,time,datetime,os

def demo():
    lock.acquire()
    time.sleep(10)
    q.put(1)
    print('执行时间:',datetime.datetime.now(),f'子进程名字:{multiprocessing.current_process().name},当前进程ID:{os.getpid()},父进程ID:{os.getppid()}')
    lock.release()

def demo2():
    lock.acquire()
    time.sleep(10)
    q.put(2)
    print('执行时间:',datetime.datetime.now(),f'子进程名字:{multiprocessing.current_process().name},当前进程ID:{os.getpid()},父进程ID:{os.getppid()}')
    lock.release()

q=multiprocessing.Queue()
t=[]
lock=multiprocessing.Lock()
t.append(multiprocessing.Process(target=demo,name=f'进程1'))
t.append(multiprocessing.Process(target=demo2,name=f'进程2'))

print('1.py脚本主程序开始执行时间',datetime.datetime.now())
for i in t:
    i.start()
for i in t:
    i.join()
while not q.empty():
    print('q的值:',q.get())

2.py文件内容

import multiprocessing,time,datetime,os

def demo():
    lock.acquire()
    time.sleep(1)
    q.put(1)
    print('执行时间:',datetime.datetime.now(),f'子进程名字:{multiprocessing.current_process().name},当前进程ID:{os.getpid()},父进程ID:{os.getppid()}')
    lock.release()

def demo2():
    # lock.acquire()
    time.sleep(1)
    q.put(2)
    print('执行时间:',datetime.datetime.now(),f'子进程名字:{multiprocessing.current_process().name},当前进程ID:{os.getpid()},父进程ID:{os.getppid()}')
    # lock.release()

q=multiprocessing.Queue()
t=[]
lock=multiprocessing.Lock()
t.append(multiprocessing.Process(target=demo,name=f'进程1'))
t.append(multiprocessing.Process(target=demo2,name=f'进程2'))

print('2.py脚本主程序开始执行时间',datetime.datetime.now())
for i in t:
    i.start()
for i in t:
    i.join()
while not q.empty():
    print('q的值:',q.get())

同时执行1.py 和 2.py运行结果

(python38) [root@mysql01 dtask]# python 2.py 
2.py脚本主程序开始执行时间 2024-10-25 16:11:22.094498
执行时间: 2024-10-25 16:11:23.097780 子进程名字:进程1,当前进程ID:9620,父进程ID:9619
执行时间: 2024-10-25 16:11:23.098284 子进程名字:进程2,当前进程ID:9621,父进程ID:9619
q的值: 1
q的值: 2
(python38) [root@mysql01 dtask]# python 1.py 
1.py脚本主程序开始执行时间 2024-10-25 16:11:19.230205
执行时间: 2024-10-25 16:11:29.242953 子进程名字:进程1,当前进程ID:9615,父进程ID:9614
执行时间: 2024-10-25 16:11:39.254650 子进程名字:进程2,当前进程ID:9616,父进程ID:9614
q的值: 1
q的值: 2

还有文件输入情况,如果对文件进行lock,如果另外一个没加锁也是一样效果

import multiprocessing,time,datetime,os

def demo():
    lock.acquire()
    time.sleep(10)
    # for i in range(10):
    #     q.put(f'demo-{i}')
    with open('1.txt','a+',encoding='utf-8') as f:
        for i in range(10):
            print('开始写入demo数据')
            f.write(f'demo-{i}\n')
            f.flush()
    print('执行时间1:',datetime.datetime.now(),f'子进程名字:{multiprocessing.current_process().name},当前进程ID:{os.getpid()},父进程ID:{os.getppid()}')
    lock.release()

def demo2():
    # lock.acquire()
    # for i in range(10,20):
    #     q.put(f'demo2-{i}')
    print(f'开始时间:{datetime.datetime.now()}')
    with open('1.txt','a+',encoding='utf-8') as f:
        for i in range(11,40):
            time.sleep(1)
            print('开始写入demo2数据')
            f.write(f'demo2-{i}\n')
            f.flush()
    print('执行时间2:',datetime.datetime.now(),f'子进程名字:{multiprocessing.current_process().name},当前进程ID:{os.getpid()},父进程ID:{os.getppid()}')
    # lock.release()

q=multiprocessing.Queue()
t=[]
lock=multiprocessing.Lock()
t.append(multiprocessing.Process(target=demo,name=f'进程1'))
t.append(multiprocessing.Process(target=demo2,name=f'进程2'))
print('1.py脚本主程序开始执行时间',datetime.datetime.now())
for i in t:
    i.start()
for i in t:
    i.join()
while not q.empty():
    print('q的值:',q.get())
print('程序结束时间:',datetime.datetime.now())

执行结果

(python38) [root@mysql01 dtask]# python 1.py 
1.py脚本主程序开始执行时间 2024-10-28 15:09:06.458782
开始时间:2024-10-28 15:09:06.460716
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo数据
开始写入demo数据
开始写入demo数据
开始写入demo数据
开始写入demo数据
开始写入demo数据
开始写入demo数据
开始写入demo数据
开始写入demo数据
开始写入demo数据
执行时间1: 2024-10-28 15:09:16.470825 子进程名字:进程1,当前进程ID:16878,父进程ID:16877
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
开始写入demo2数据
执行时间2: 2024-10-28 15:09:35.521156 子进程名字:进程2,当前进程ID:16879,父进程ID:16877
程序结束时间: 2024-10-28 15:09:35.521762

(python38) [root@mysql01 dtask]# more 1.txt 
demo2-11
demo2-12
demo2-13
demo2-14
demo2-15
demo2-16
demo2-17
demo2-18
demo2-19
demo-0
demo-1
demo-2
demo-3
demo-4
demo-5
demo-6
demo-7
demo-8
demo-9
demo2-20
demo2-21
demo2-22
demo2-23
demo2-24
demo2-25
demo2-26
demo2-27
demo2-28
demo2-29
demo2-30
demo2-31
demo2-32
demo2-33
demo2-34
demo2-35
demo2-36
demo2-37
demo2-38
demo2-39

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2225627.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NSSCTF刷题篇web部分

源码泄露 [FSCTF 2023]寻找蛛丝马迹 这个源码泄露,可以记录一下,涉及的知识点比较多 打开环境 查看源码, 第一段flag 乱码,恢复一下 乱码恢复网站:乱码恢复 (mytju.com) 剩下的就只说方法 http://node4.anna.nss…

python实现放烟花效果庆祝元旦

马上就要2025年元旦啦,提前祝大家新年快乐 完整代码下载地址:https://download.csdn.net/download/ture_mydream/89926458

uaGate SI——实现OT与IT的安全连接

对于许多制造商来说,诸如工业物联网(IIoT)、信息物理系统(CPS)和大数据等概念已经开始与其智能工厂的愿景紧密相连。智能工厂是将信息技术(IT)的数字世界与运营技术(OT)的…

H5的Canvas绘图——使用fabricjs绘制一个可多选的随机9宫格

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,最近一直被测试…

node升级package.json中的版本

由于项目使用时间过老,升级对应包版本,可以使用新功能 1.使用npm-check-updates这个工具,先全局安装 npm install -g npm-check-updates2.检查package.json中dependencies的最新版本 ncu3.更新dependencies到新版本 ncu -u也是一样的 npx…

微知SOP-定位Linux crash问题的几个常用方面和常用命令?

文章目录 1 背景2 问题描述和SOP2.1 进入目录2.2 安装crasn和vmlinux2.3 使用crash命令进入debug目录2.4 收集主要信息2.5 收集task关键信息2.6 查看堆栈信息2.7 使用反汇编查看crash所在行2.8 根据寄存器获取一些关键数据2.9 根据堆栈获取信息2.10 加载内核模块2.11 收集其他t…

宿舍管理新篇章:基于Spring Boot的系统开发

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…

零基础学linux文件管理

目录 引言 基础知识 回顾C语言 fopen fclose 更改进程路径:chdir fwrite可以用来写入 sizeof字符串 C语言默认打开三个输入输出流 过渡到系统 系统调用:open “位字段”或“位掩码” open的使用 关闭文件:close 写入&#xff1…

【C++】继承与模板

继承 1.继承的概念 概念:继承(inheritace)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称之为派生类。继承呈现了面向对象程序设计的…

AI创作者与人类创作者的协作模式

公主请阅 1. AI创作者的崛起1.1 AI创作者的工作原理1.2 AI创作者的优势 2. 人类创作者的独特价值2.1 创造性与情感2.2 伦理与价值观2.3 文化与背景 3. AI与人类的协作模式3.1 协同创作3.2 内容编辑3.3 数据驱动的创作3.4 跨媒体协作 4. AI与人类协作的挑战4.1 技术局限性4.2 版…

Linux学习笔记 | sudo命令的基本使用

sudo命令 sudo 命令是 Unix 和 Linux 系统中用于执行需要超级用户权限(即 root 权限)操作的工具。它允许系统管理员授予某些用户(或用户组)以 root 或其他指定用户的权限来运行特定命令,而无需知道 root 用户的密码。…

在Java中,需要每120分钟刷新一次的`assetoken`,并且你想使用Redis作为缓存来存储和管理这个令牌

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把手教你开发炫酷的vbs脚本制作(完善中……) 4、牛逼哄哄的 IDEA编程利器技巧(编写中……) 5、面经吐血整理的 面试技…

Uni-App-02

条件编译 条件编译概念 不同的运行平台终归有些专有的特性,无法实现跨平台完全兼容,例如:微信小程序导航栏右上角的关闭图标。 uni-app提供了一种“条件编译”机制,可以针对特定的平台编译执行特定的代码,否则不执行。…

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十二)拓展图优化库g2o(一)框架

【转载】理解图优化,一步步带你看懂g2o框架 文章来源:理解图优化,一步步带你看懂g2o框架 小白:师兄师兄,最近我在看SLAM的优化算法,有种方法叫“图优化”,以前学习算法的时候还有一个优化方法…

Spring Web MVC 入门

1. 什么是 Spring Web MVC Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从从⼀开始就包含在Spring框架中。它的 正式名称“SpringWebMVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC". 什么是Servlet呢? Ser…

OpenAI被爆12月发布其Orion AI模型!波兰“OFF”电台解雇所有记者,启用AI“主持人”|AI日报

文章推荐 Stability AI一口气推出3款图像生成模型系列!升级版Claude 3.5 Sonnet能像人类一样操控电脑|AI日报 今日热点 据报道,OpenAI计划于12月发布其Orion AI模型 据The Verge昨日报道,OpenAI计划在今年12月之前发布其下一个…

ctfshow(171,172,173)--SQL注入--联合注入

Web171 进入靶场,是一个SQL查询界面: 审计: 查询语句如下: $sql "select username,password from user where username !flag and id ".$_GET[id]." limit 1;";语句功能从数据表user中查询username,pa…

MATLAB生态环境数据处理与分析

原文链接:MATLAB在生态环境数据处理与分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247624407&idx4&sn39c8119bba0797e6bf5cc35eea1c6767&chksmfa8da730cdfa2e266dac5221af101230d7ded29576a34856b31f736a89dbb2e3e481a5e94e8a&to…

日常笔记记录

1、Http 1.1 概念 HTTP 是 HyperText Transfer Protocol(超文本传输协议)的简写,它是 TCP/IP 协议集中的一个应用层协议,是客户端与服务端进行交互时必须遵循的规则。它用于定义 Web 浏览器与 Web 服务器之间交换数据的过程以及…

【Docker】在AlmaLinux 8.10系统中安装Docker-ce过程分享

随着2024年6月30日,官方停止了对CentOS 7的维护,属于CentOS 7的时代终于结束了。当然,对于CentOS 7的维护停止,大家也不用过度紧张,目前仍有部分Linux版本可以提供企业级的生产可用系统服务,比如&#xff1…