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

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

import multiprocessing,time,datetime
a=1
def demo1():global aa+=1print('进程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,osdef 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,osdef 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,osdef 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,osdef 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,osdef 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,osdef 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,osdef 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.mzph.cn/pingmian/58297.shtml

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

相关文章

EasyPlayer.js网页播放器,支持FLV、HLS、WebSocket、WebRTC、H.264/H.265、MP4、ts各种音视频流播放

EasyPlayer.js功能: 1、支持解码H.264视频(Baseline, Main, High Profile全支持,支持解码B帧视频) 2、支持解码H.265视频(flv id 12) 3、支持解码AAC音频(LC,HE,HEv2 Profile全支持) 4、支持解码MP3音频以及Speex音频格式 5、可…

【linux网络编程】| socket套接字 | 实现UDP协议聊天室

前言:本节内容将带友友们实现一个UDP协议的聊天室。 主要原理是客户端发送数据给服务端。 服务端将数据再转发给所有链接服务端的客户端。 所以, 我们主要就是要实现客户端以及服务端的逻辑代码。 那么, 接下来开始我们的学习吧。 ps:本节内容…

Spark SQL DSL

1、 Spark sql -- 代替hive的(并非完全代替) (1) Spark sql 和 hive 区别 : 两者都是写sql的,区别是计算引擎不一样 hive -- 计算引擎是MapReduce ,是通过MR做计算的 Spark sql -- 计算引擎是Saprk Core&#xff…

Go语言捕获和处理异常

在Go语言中,异常处理机制与其他语言(如Java或Python)有所不同。Go并没有传统意义上的异常机制,而是通过返回值来处理错误。不过,Go语言也提供了 panic 和 recover 机制来处理运行时错误。本文将介绍这两种机制的使用。…

vivo 轩辕文件系统:AI 计算平台存储性能优化实践

在早期阶段,vivo AI 计算平台使用 GlusterFS 作为底层存储基座。随着数据规模的扩大和多种业务场景的接入,开始出现性能、维护等问题。为此,vivo 转而采用了自研的轩辕文件系统,该系统是基于 JuiceFS 开源版本开发的一款分布式文件…

Java | Leetcode Java题解之第520题检测大写字母

题目: 题解: class Solution {public boolean detectCapitalUse(String word) {// 若第 1 个字母为小写,则需额外判断第 2 个字母是否为小写if (word.length() > 2 && Character.isLowerCase(word.charAt(0)) && Charact…

如何封装一个可取消的 HTTP 请求?

前言 你可能会好奇什么样的场景会需要取消 HTTP 请求呢? 确实在实际的项目开发中,可能会很少有这样的需求,但是不代表没有,比如: 假如要实现上述这个公告栏,每点击一个 tab 按钮就会切换展示容器容器中…

图的最短路径算法-迪杰斯特拉(Dijkstra)算法与弗洛伊德(Frolyd)算法(更新中)

一、最短路径算法(Shortest Path) 最短路径问题是图论研究中的一个经典算法问题,旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 最短路径不一定是经过边最少的路径,但在这些最短路径中&#x…

JSON文件转YOLO文件示例

文章目录 前言一、步骤指南二、代码实现1.类别名称到ID的映射2.边界框转换函数3.JSON解码函数4.主程序 前言 将JSON标注文件转换为YOLO格式通常涉及从JSON文件中提取图像尺寸、对象类别和边界框坐标,并将这些信息格式化为YOLO格式所需的格式。YOLO格式通常要求每行…

ubuntu编译ffmpeg

配置 运行环境:vmware ubuntu 20.04 时间:2024年10月24日 权限问题:由于ubuntu权限问题 建议使用root权限编译,且~是根据用户组来进行定位的。 环境配置更新 cd ~ && \ mkdir ffmpeg_sources ffmpeg_build bin &…

EasyExcel自定义下拉注解的三种实现方式

文章目录 一、简介二、关键组件1、ExcelSelected注解2、ExcelDynamicSelect接口(仅用于方式二)3、ExcelSelectedResolve类4、SelectedSheetWriteHandler类 三、实际应用总结 一、简介 在使用EasyExcel设置下拉数据时,每次都要创建一个SheetWr…

【vs2022】windows可用的依赖预编译库

ffmpeg 、x264 、x265 等。obs是基于qt6+vs2022+64bit obs的官网传统构建已经不用了obs的s2022构建OBS Deps Build 2024-09-12FFmpeg4.4 库,x64 可用。

每天五分钟深度学习pytoroch:基于pytorch搭建逻辑回归算法模型

本文重点 前面我们学习了线性回归模型的搭建,无论是基于pytorch还是不基于pytorch,以上的模型都是回归模型,本文我们将使用pytorch搭建逻辑回归模型,逻辑回归模型是一个经典的分类问题。 模型搭建 class LogisticRegression(nn.Module) : def __init__(self) :super (Lo…

嵌入式软件 Bug 排查与调试技巧

目录 1、准备工作 2、打印调试 实现步骤 注意事项 3、断点调试 4、观察点调试 5、远程调试 6、内存分析 内存泄漏检测 栈溢出检测 7、异常处理 8、性能分析 9、逻辑分析仪 10、示波器 11、常见bug类型 12、调试策略 1、准备工作 硬件工具准备 调试器:例如 J - …

玩转Docker | 使用Docker部署推箱子网页小游戏

玩转Docker | 使用Docker部署推箱子网页小游戏 一、项目介绍项目简介项目预览 二、系统要求环境要求环境检查Docker版本检查检查操作系统版本 三、部署推箱子网页小游戏下载镜像创建容器检查容器状态检查服务端口安全设置 四、访问推箱子网页小游戏五、总结 一、项目介绍 项目…

什么是服务器?服务器与客户端的关系?本地方访问不了网址与服务器访问不了是什么意思?有何区别

服务器是一种高性能的计算机,它通过网络为其他计算机(称为客户端)提供服务。这些服务可以包括文件存储、打印服务、数据库服务或运行应用程序等。服务器通常具有强大的处理器、大量的内存和大容量的存储空间,以便能够处理多个客户…

Iperius Backup(数据备份软件) v8.3.0 中文免费版

下载: 【1】https://pan.quark.cn/s/19ef716c02d5 【2】https://drive.uc.cn/s/197acba8d8d94?public1 Iperius Backup是一款专业的备份还原软件,功能强大,支持DAT备份、LTO备份、NAS备份、磁带备份、RDX驱动器、USB备份,满足用…

SOES(EtherCAT)从站API梳理

1. void ESC_config (esc_cfg_t * cfg); 功能:配置EtherCAT从站。参数:esc_cfg_t *cfg 指向配置结构体的指针,该结构体包含从站的配置参数。解释:该函数用于初始化或更新从站的配置,如通信参数、同步管理器设置等。 …

Java Lock Condition 总结

前言 相关系列 《Java & Lock & 目录》(持续更新)《Java & Lock & Condition & 源码》(学习过程/多有漏误/仅作参考/不再更新)《Java & Lock & Condition & 总结》(学习总结/最新最准…

K8S测试pod内存和CPU资源不足

只设置requests参数 mysql主从pod启动后监控 读压测之后 同时设置limits和requests,只调低内存值 监控 压力测试 同时设置limits和requests,只调低CPU值 初始状态 开始压测 结论 对于CPU,如果pod中服务使用CPU超过设置的limits&…