零基础学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…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
