零基础学python之高级编程(6)---Python中进程的Queue 和进程锁,以及进程池的创建 (包含详细注释代码)
Python中进程的Queue 和进程锁,以及进程池的创建
文章目录
- Python中进程的Queue 和进程锁,以及进程池的创建
- 前言
- 一、进程间同步通信(Queue)
- 二、进程锁(Lock)
- 三、创建进程池Poor
- pool 类方法:
- End!
前言
大家好,上一篇文章,我们初步接触了进程的概念及其应该如何创建一个进程等等,今天我们继续来深入学习一下进程中的进程间同步 Queue 和进程锁lock 还有进行创建一个进程池pool 等等,我们开始今天的学习吧 !
一、进程间同步通信(Queue)
我们在使用进程的时候,有时候我们需要进行进程之间的通信,multiprocessing 模块提供了Queue类 来实现不同进程之间的通信.
Queue():括号内传的参数表示最大可接受的消息数量;没有传参或者数量为负数,则表示最大可接受的数量没有上限(直到内存的尽头)
Queue.put(item, block, timeout) : 将item消息写入队列中,block默认为True.
- 如果block使用默认值,且没有设置timeout秒数,消息队列如果已经没有空间可以写入,将会被阻塞,直到从消息队列腾出空间为止
- 如果block使用默认值,设置了timeout秒数,则会等待timeout秒,若还没有空间,则会抛出异常’queue.full’.
我们首先先创建一个进程对象:

上图就是我们queue 中的方法,接下来我们看看如何使用queue.
from multiprocessing import Queueq = Queue(3) # 创建一个Queue 对象,设置最大可接受put对象为3个
q.put('消息1')
q.put('消息2')
print(q.full()) # 判断队列是否满了 这里面输出False
q.put('消息3')
print(q.full()) #判断队列是否满了 这里面输出Trueprint(q.get()) # 获取队列中的消息,获取后把消息从队列中删除if not q.full(): # 判断队列是否满,如果不满就继续将消息写入队列q.put('消息4')print(q.get())
print(q.get())
print(q.get())
运行结果:

from multiprocessing import Queueq = Queue(3) # 创建一个Queue 对象,设置最大可接受put对象为3个
q.put('消息1')
q.put('消息2')
print(q.full()) # 判断队列是否满了 这里面输出False
q.put('消息3')
print(q.full()) #判断队列是否满了 这里面输出Trueprint(q.get())
if not q.full():q.put('消息4')# print(q.get())
# print(q.get())
# print(q.get())if not q.empty(): # 判断队列是否为空for i in range(q.qsize()): print(q.get_nowait())
运行结果:

注意:
Queue.put_nowait(item)===>Queue.put(item, False)
Queue.get_nowait()===>Queue.get(False)
Queue.get(block, timeout):获取队列中的一条信息,然后将其从队列中移除,block默认为True
-
如果block使用默认值,且没有设置timeout秒数,消息队列如果为空,将会被阻塞,直到从消息队列读到消息为止.
-
如果block使用默认值,设置了timeout秒数,则会等待timeout秒,若还没有消息,则会抛出异常’queue.empty’.
如果block值为False,消息队列如果为空,则立即抛出异常’queue.empty
接下来我们进行一次完整的进程间的通信
import multiprocessing #导包
import time
import randomdef write(q): # 定义一个函数for i in ['a', 'b', 'c']: print('放入:', i)q.put(i) # 分别将a,b,c 消息传入队列time.sleep(random.random())def read(q):while True:if not q.empty():print('获取:', q.get()) 获取队列中的消息time.sleep(random.random())else:breakif __name__ == '__main__':q = multiprocessing.Queue() # 创建一个Queue对象 qpw = multiprocessing.Process(target=write, args=(q, )) # 创建一个子进程 pw ,并将queue 对象传入pr = multiprocessing.Process(target=read, args=(q, )) # 创建一个子进程 pr,并将queue对象传入pw.start() # pw 子进程开始pw.join() # 等待 pw进程结束 pr.start() # pr 子进程开始pr.join() # 等待 pr进程结束print('结束')
运行结果:

二、进程锁(Lock)
Python进程锁是用来在多进程程序中对共享资源进行同步访问的一种机制。
当多个进程需要同时访问某个共享资源时,可能会出现竞争条件(race condition),导致数据不一致或错误的结果。进程锁可以用来保证在任意时刻只有一个进程能够访问共享资源,从而避免竞争条件的发生。
进程锁的主要作用是确保在某个进程正在使用共享资源时,其他进程无法访问该资源,直到当前进程释放锁为止。这样可以保证共享资源在任意时刻只会被一个进程修改,从而避免数据不一致或错误的结果。
Python中的进程锁可以通过使用multiprocessing模块中的Lock类来实现。通过调用lock.acquire()方法可以获得锁,其他进程如果尝试获得同一个锁则会被阻塞。而通过调用lock.release()方法可以释放锁,允许其他进程获得锁并访问共享资源。
需要注意的是,进程锁只能在同一个计算机的多个进程之间起作用,无法在不同计算机之间的进程之间起作用。如果需要进行跨网络的进程同步,可以考虑使用分布式锁的机制。
Python中可以使用多种方式实现进程锁,以下是常用的两种:
使用multiprocessing.Lock():multiprocessing.Lock()是Python标准库中的一个进程锁实现。可以通过acquire()方法获得锁,并在任务完成后使用release()方法释放锁。
例如:
from multiprocessing import Lock, Processdef func(lock, num):lock.acquire()try:# 临界区代码print(f"进程{num}获得了锁")finally:lock.release()print(f"进程{num}释放了锁")if __name__ == "__main__":lock = Lock()processes = []for i in range(5):p = Process(target=func, args=(lock, i))processes.append(p)p.start()for p in processes:p.join()
也可使用multiprocessing.Manager().Lock():multiprocessing.Manager()是一个多进程共享数据的管理器。可以通过Manager().Lock()方法创建一个进程锁。具体使用方式与multiprocessing.Lock()相同,只是创建锁的方式有所不同。
例如:
from multiprocessing import Process, Managerdef func(lock, num):lock.acquire()try:# 临界区代码print(f"进程{num}获得了锁")finally:lock.release()print(f"进程{num}释放了锁")if __name__ == "__main__":manager = Manager()lock = manager.Lock()processes = []for i in range(5):p = Process(target=func, args=(lock, i))processes.append(p)p.start()for p in processes:p.join()
三、创建进程池Poor
Python进程池:是一种用于管理和复用多个进程的工具。进程池可以提高程序的并发处理能力,通过复用已经创建的进程,避免频繁创建和销毁进程的开销。
pool 类方法:
Pool()括号内表示处理的进程数量
apply_async(func, args, kwargs):使用非阻塞方式调用func(并行执行,阻塞就是必须等待上一个进程退出才能执行下一个进程)
close():关闭进程池,不在接收新的进程
terminate():不管任务是否完成,立即终止
join():阻塞,等待所有子进程结束,必须在close之后使用.
import multiprocessing
import timedef run(f):time.sleep(1)return f * fif __name__ == '__main__':test = [1, 2, 3, 4, 5, 6]# print('顺序:')# s = time.time() # 计算当前时间# for i in test:# print(run(i))e = time.time()# print('顺序执行时间:', int(e-s))# map(函数名, 可迭代对象):循环将可迭代对象传递给函数执行print('并发:')pool = multiprocessing.Pool(5) # 创建能够有5条进程的进程池r1 = pool.map(run, test)pool.close()pool.join()e2 = time.time()print('并发时间:', int(e2 - e))print(r1)
运行结果:

在进程池里进行进程间的通信
例如:
import multiprocessing, os, time, randomdef write(q):print('write(%s)启动' % os.getpid())for i in ['a', 'b', 'c', 'd', 'e']:q.put(i)def read(q):print('read(%s)启动' % os.getpid())for i in range(q.qsize()):print('获取:', q.get())if __name__ == '__main__':print('主进程(%s)开始' % os.getpid())q = multiprocessing.Manager().Queue()pool = multiprocessing.Pool()pool.apply_async(write, (q, ))pool.apply_async(read, (q, ))pool.close()pool.join()print('主进程结束')
运行结果:

End!
讲的不好,多多见谅,我们下次再见!
更多优质文章点这里
相关文章:
零基础学python之高级编程(6)---Python中进程的Queue 和进程锁,以及进程池的创建 (包含详细注释代码)
Python中进程的Queue 和进程锁,以及进程池的创建 文章目录 Python中进程的Queue 和进程锁,以及进程池的创建前言一、进程间同步通信(Queue)二、进程锁(Lock)三、创建进程池Poorpool 类方法: End! 前言 大家好,上一篇文章,我们初步接触了进程的概念及其应…...
184. 部门工资最高的员工
文章目录 题意思路代码 题意 题目链接 查出每个部门最高工资 思路 子查询group by 代码 select b.name as Department,a.name as Employee,salary from Employee as a left joinDepartment as b ona.departmentId b.id where(a.departmentId, salary) in(select departme…...
插值表达式、Vue指令、指令补充
vue上手步骤 <body><!-- vue2语法 --><!-- 1.准备容器:一会vue就会把数据展示到这里 --><div id"app"><!-- 4.使用{{ }}即可显示数据 ,{{}}就是插值表达式--><p>姓名:{{uname}}</p><…...
qiankun实现基座、子应用样式隔离
目录 qiankun 实现主应用与子应用样式隔离使用CSS-in-JS来实现样式隔离react-jssstyled-components qiankun 实现主应用与子应用样式隔离 qiankun 之中默认的样式隔离是针对子应用与子应用之间的。至于主应用的样式会影响到子应用,若需要,则需要配置进行…...
C语言从入门到实战----数据在内存中的存储
1. 整数在内存中的存储 在讲解操作符的时候,我们就讲过了下⾯的内容: 整数的2进制表⽰⽅法有三种,即 原码、反码和补码 有符号的整数,三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤…...
接口关联和requests库
一、接口关联 postman的接口 postman的接口关联配置:js代码,重点在于思路。 // 定义jsonData这个变量 接受登录接口的返回结果 var jsonData JSON.parse(responseBody); // 从返回结果里提取token/id值,并赋值给token/id变量值作为环境变…...
Python编程基础 001 开篇:为什么要学习编程
Python编程基础 001 开篇:为什么要学习编程 一、什么是程序,什么是编程二、学习编程对青少年的价值(一)未来社会的需要(二)学习对现青少年现的现阶段的直接影响 三、学习编程从什么时候开始(一)…...
AQS源码分析
前言 AbstractQueuedSynchronizer是抽象同步队列,其是实现同步机器的基础组件,并发包中的锁的底层就是使用AQS实现的。AQS中 维护了一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用资源被阻塞…...
应对Locked勒索病毒威胁:你的数据安全准备好了吗?
导言: .Locked勒索病毒,作为一种新型的恶意软件,已经在全球范围内引起了广泛的关注。这种病毒通过加密受害者的文件,并要求支付赎金以获取解密密钥,从而实现对受害者的勒索。本文旨在深入解析.Locked勒索病毒的特点、…...
周末分享一篇关于html和http的文章吧
前面咱们说了https://blog.csdn.net/luohaitao/article/details/136974344(说道说道JSP和HTTP吧-CSDN博客),把http的方法和jsp中httpservle对象的方法对上号了,其实从开发的角度看,jsp就是html中混入了java的服务端代码…...
Frechet分布
Frechet分布是一种连续概率分布,它是极值统计中的一个重要模型,尤其在分析极端事件(如洪水、地震、金融市场中的极端波动)的最大值极限分布时扮演关键角色。Frechet分布属于极值分布的三种基本类型(I型、II型、III型&a…...
vue3全局引入element-plus使用Message教程
文章目录 安装引入 Element Plus和组件样式示例注意安装与引入:按需引入:API 使用:样式问题:组件上下文:版本兼容性:错误处理: 这是 Element UI 的 Vue 3 版本。ElMessage 是 Element Plus 中的…...
时序预测 | Matlab实现BiTCN-BiLSTM双向时间卷积神经网络结合双向长短期记忆神经网络时间序列预测
时序预测 | Matlab实现BiTCN-BiLSTM双向时间卷积神经网络结合双向长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现BiTCN-BiLSTM双向时间卷积神经网络结合双向长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现BiTCN…...
基于 Linux 的更新版 MaxPatrol VM 可扫描 Windows
👾 MaxPatrol VM 2.1 是俄罗斯唯一一款可以安装在 Linux 上并以审计和五重测试模式扫描 Windows 主机(甚至是旧版本)的漏洞管理产品。 让我们告诉你更新后的 MaxPatrol VM 还有哪些有用的功能: 1. 由于采用了新的数据存储模式&a…...
【软件开发】给Ubuntu 18.04虚拟机安装最新的Python 3.12.2
一、前言 笔者在Windows 11主机上安装有Ubuntu 18.04虚拟机(使用虚拟化平台Oracle VM VirtualBox),在Python3.6的使用过程中遇到了问题,决定安装Python 3.12.2,在此记录安装过程。 二、安装过程(在Ubuntu…...
鸿蒙NXET实战:高德地图定位SDK【获取Key+获取定位数据】(二)
如何申请key 1、创建新应用 进入[控制台],创建一个新应用。如果您之前已经创建过应用,可直接跳过这个步骤。 2、添加新Key 在创建的应用上点击"添加新Key"按钮,在弹出的对话框中,依次:输入应用名名称&…...
Dubbo管理控制台
1.将资料中的dubbo-admin-2.6.0.war文件复制到tomcat的webapps目录下 2.启动tomcat,修改WEB-INF下的dubbo.properties文件 #如果Zookeeper是安装在虚拟机上的那么注册中心的地址需要修改为虚拟机的ip地址 dubbo.registry.addresszookeeper://192.168.100.110:2181 dubbo.admin…...
CSS问题精粹1
1.关于消除<li>列表前的符号 我相信很多人在初学CSS时会遇到该问题,无论是创作导航,还是列表,前面都会有个黑点点或其它符号。 解决该问题其实很简单 采用list-style-type:none或list-style:none直接解决 如果你想更换前面的黑点点&a…...
neo4j所有关系只显示RELATION,而不显示具体的关系
当看r时,真正的关系在properties中的type里,而type为“RELATION” 造成这个的原因是: 在创建关系时,需要指定关系的类型,这是固定的,不能像属性那样从CSV文件的一个字段动态赋值。标准的Cypher查询语言不支…...
VMware和Xshell连接
1.开启虚拟机 2.使用管理员账户,点击未列出 3.输入用户名密码 4.点击编辑虚拟网络编辑器 5.记住自己的网关和IP地址 6.打开终端 7.输入命令,vim / etc / sysconfig / network -scripts / ifcfg-ens33 回车 8.修改图中两处按“ I ”键进入编辑 d…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除
目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作…...
