Python之进程池、阻塞模式、非阻塞模式、进程间的通信、queue

非阻塞模式

# 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程
# 但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法.
# 初始化Poo1时,可以指定一个最大进程数,当有新的请求提交到Poo1中时,如果池还没有满,
# 那么就会创建一个新的进程用来执行该请求,但如果池中的进程数已经达到指定的最大值,那么 该请求就会等待
# 直到池中有进程结束,才会创建新的进程来执行。
#阻塞式:添加一个执行一个,然后接着添加下一个
#非阻塞式,全部添加到队列,立刻返回,并不会等待他们执行完毕,但是回调函数是等待任务执行完毕后才调用
import os
import time
from multiprocessing import Pool
from random import random
def task(task_name):print("开始做任务",task_name)#记录开始时间start = time.time()#模拟做任务time.sleep(random()*2)end = time.time()return "完成任务用时",(end-start),'进程id',os.getpid()'''
回调函数,当我们任务做完了,我们想把这个事情通知一下,我们把通知给扔出去了,扔给了回调函数
'''
container = []
def callback_func(n):container.append(n)if __name__ == '__main__':#Pool()需要传递参数,整型的参数pool = Pool(5)tasks = ['听音乐','吃饭','洗衣服','打游戏','散步','看孩子','做饭']#模拟循环创建8个任务for i in tasks:#下面函数表示用的是池子的非阻塞模式,需要传递函数,然后函数需要参数,需要可迭代的参数#循环一次池子添加一个任务#要使用进程池,要挡住你的主进程,因为进程或者要依靠主进程#callback需要传递的参数就是你的回调函数#回调函数就是当你的任务完成时,将任务完成的结果返回给回调函数,也就是test1的返回值成了callback_func的参数#之后可以在最后产生结果pool.apply_async(task,args=(i,),callback=callback_func)pool.close() #添加任务结束pool.join()#相当于插队,不让你的主进程往下走for c in container:print(c)

 结果

阻塞模式

#阻塞式
#进程的优点没有体现出来,不可以并行
#添加一个任务执行一个任务,如果一个任务不结束,另外一个让你无就进不来
#进程池:
#pool = Pool(max) 创建进程池对象
# pool.apply()阻塞
# pool.apply_async()非阻塞
# pool.close()
# pool.join()让主进程给子进程让路
import os
import time
from multiprocessing import Pool
from random import random
def task(task_name):print("开始做任务",task_name)#记录开始时间start = time.time()#模拟做任务time.sleep(random()*2)end = time.time()print("完成任务用时", (end - start), '进程id', os.getpid())
# container = []
# def callback_func(n):
#     container.append(n)
if __name__ == '__main__':pool = Pool(5)pool = Pool(5)tasks = ['听音乐', '吃饭', '洗衣服', '打游戏', '散步', '看孩子', '做饭']for i in tasks:pool.apply(task, args=(i,))pool.close()pool.join()

结果

 

queue

# 当进程平行执行时,数据如何从一个地方传输到另外一个地方,这个时候就需要用到队列了
# 队列就相当于在两个进程中搭个梯子,然后传输数据,queue
from multiprocessing import Queue
# queue需要的参数,通过put往Queue放东西
#规定队列里面的东西不超过5个
#put参数有个timeout,这个参数就是当有个东西等待相应的时间若还是没有空出来,就会报异常
q=Queue(5)
q.put('a')
q.put('b')
q.put('c')
q.put('d')
q.put('e')
print(q.qsize())
if not q.full(): #full用来判断队列是否满了 q.empty()判断队列是不是空的q.put('f',timeout=4) #如果你的队列满了,则你现在只能等,除非队列里面空出一个位置
else:print("队列已满")#取出队列的值,同样这个也有个timeout参数,这个就是当你取东西的时间超过了对应时间,就会报异常
#这个异常可以用try去掉
print(q.get())
print(q.get(timeout=2))
print(q.get(timeout=2))
print(q.get(timeout=2))
print(q.get(timeout=2))
print(q.get(timeout=2))
print(q.get(timeout=2))
print(q.get(timeout=2))

结果

 进程间通信

借助queue

# 白大黑
# 开发时间:$[DATE] $[TIME]
from multiprocessing import Process,Queue
from time import sleepdef download(q):#模拟图片images=['a.jpg','b.jpg','c.jpg']#模拟下载图片for i in  images:print('正在下载',i)sleep(0.5)q.put(i)#下载成功后需要把文件送到getfile中,然后getfile拿到这个文件,就把这个文件放到一个具体的位置
#但是现在是两个进程,两个进程是平行的。如何把下载的东西上传到getfile中就是一个问题
#这时queue就出现了
#两者通信当然要保持两者通道是一致的,queue当然使用的是一个
#所以需要两个函数都弄一个参数q,然后使用args参数传进去
def getfile(q):while True:try:file = q.get(timeout=2)print('{}文件保存成功'.format(file))except:print('保存完毕')breakif __name__ == '__main__':q=Queue(5)#当download执行完成后,他就会把剩下的内存回收,这时getfile就不能用了,所以下载的东西可能不完全#所以就需要p1这个任务等待一下p1 = Process(target=download,args=(q,))p2 = Process(target=getfile,args=(q,))p1.start()#放了join就相当于p1插队了p1.join()p2.start()

结果

 进程对于全局变量的访问

import os
from multiprocessing import Process
from time import sleep
#当你的子进程调用全局变量的时候,相当于每个子进程会拥有一个自己的m变量,意思是两个子进程的变量m是分开的
#m是不可变类型,可变类型也是同理,这样就实现了多任务
m = 1
def test1(x):global mwhile True:sleep(x)m = m+1print("这是任务1",'子',os.getpid(),'父',os.getppid(),m)def test2(a):global mwhile True:sleep(a)m = m + 1#os.getpid进程号os.getppid父进程号print('这是任务2','子',os.getpid(),'父',os.getppid(),m)
if __name__ == '__main__':#创建进程,这是两个子进程,当你运行程序的时候python解释器就已经默认给你分配了一个进程,然后这个程序里面有创建了两个子进程#若是需要传参数,Process有别的属性args这个后面需要跟一个可迭代的,这个里面的就是你给函数传的参数#p.run只启动任务不执行进程,p.start启动进程并执行任务.p.terminate终止进程p = Process(target=test1,name='任务1',args=(1,))p.start()print(p.name)p1 = Process(target=test2,name="任务2",args=(2,))p1.start()print(p1.name)

 结果

m是每个进程单独的一个


不嫌弃的点点关注,点点赞 ଘ(੭ˊᵕˋ)੭* ੈ✩‧₊˚

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

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

相关文章

Gif动态闪图如何制作?教你1分钟快速制作

动态文字闪图是一种独特而有趣的图像效果,通过将文字以闪烁、跳动或变换的方式呈现,给人一种动态感和视觉冲击力。如果你想制作自己的动态文字闪图,下面是一些简单的方法来帮助你完成这个任务。使用在线闪图制作网站-GIF5工具网,无…

【09】进阶JavaScript事件循环Promise

一、事件循环 浏览器的进程模型 何为进程? 程序运行需要有它自己专属的内存空间,可以把这块内存空间简单的理解为进程 每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意。 何为线程? 有了进程后,就可以运行程序的代码了。 运行代码的「人」称之…

算法之位运算

常见的位运算操作: 首先先熟悉一下常见的位运算操作: 1. 基础位运算 左移<<, 右移>>, 按位与&, 按位或|, 按位异或^, 按位取反~ 注意: 异或其实是一种无进位相加. 2. 给定一个 n, 确定它的二进制表示中第x位是 0 还是 1 n & (1<<x) 或者 (n>…

软件工程-第11章 内容总结

如果不想读这本书&#xff0c;直接看这一章即可。 11.1 关于软件过程范型 11.2 关于软件设计方法

微信小程序开发学习笔记——4.4常见的导航栏api接口

>>跟着b站up主“咸虾米_”学习微信小程序开发中&#xff0c;把学习记录存到这方便后续查找。 课程连接&#xff1a;https://www.bilibili.com/video/BV19G4y1K74d?p29&vd_source9b149469177ab5fdc47515e14cf3cf74 一、属性 界面 / 导航栏 / wx.showNavigationBar…

Vue3+.NET6前后端分离式管理后台实战(四)

1&#xff0c;Vue3.NET6前后端分离式管理后台实战(四)已经发布&#xff0c; 程序源码已打包&#xff0c;感兴趣的可以关注下载。 2&#xff0c;源码打包可以下载&#xff1a;

leecode1793 | 好子数组的最大分数 | 求给高度矩阵最大值

题目我就不念了&#xff0c;就一个字难理解&#xff0c;给的题总是这么难懂&#xff0c;总感觉出题人的语文是体育老师教的&#xff1f; 还有就是思维转变&#xff0c;才能能好的理解&#xff1f;一味的钻牛角尖死理解&#xff0c;效果不好 思维的转变 >悟性&#xff1f;&am…

幼儿教育管理系统|基于jsp 技术+ Mysql+Java的幼儿教育管理系统设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;ssm&#xff0c;springboot的平台设计与实现项目系统开发资源&#xff08;可…

深入理解Ubuntu22:探索Linux操作系统的功能与应用

一、linux &#xff08;一&#xff09;、安装 1、电脑可以安装双系统&#xff0c;即在一套硬件上只能同时运行一个操作系统&#xff0c;例&#xff1a;C盘安装win&#xff0c;D盘安装linux。 2、虚拟机 虚拟机需要硬件支持&#xff0c;并需开启VT-x. 如&#xff1a;Virtual…

气象ARWpost、grads 等使用的ctl和dat格式的grd 二进制文件

气象ARWpost、grads 和 Fortran使用的ctldat格式的grd 二进制文件&#xff0c;在Python中可以用xgrads包来读取或者转成nc 格式使用。 xgrads包官网说明地址&#xff1a;https://xgrads.readthedocs.io/en/latest/ 示例1&#xff0c;打开多个空间场相同&#xff0c;时间不同的 …

安防监控视频汇聚平台EasyCVR接入海康Ehome设备,设备在线但视频无法播放是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

51单片机-蜂鸣器

1.蜂鸣器的介绍 无源蜂鸣器不能一直通电&#xff0c;无源蜂鸣器内部的线圈较小&#xff0c;易烧坏 蜂鸣器的驱动 达林顿晶体管&#xff08;npn型&#xff09; 应用&#xff1a; 按下独立按键同时蜂鸣器响起提示音&#xff0c;数码管显示对应的独立按键键码 #include <REG…

不确定性建模:传感器噪声与输入输出扰动/干扰

鲁棒性在控制系统设计中是至关重要的&#xff0c;因为实际的工程系统容易受到外部干扰和测量噪声的影响&#xff0c;而且在设计中使用的数学模型和实际中的实际系统之间总是存在差异。通常需要一个控制工程师设计一个控制器&#xff0c;使闭环系统稳定&#xff0c;并在存在干扰…

Spring的事务传播机制有哪些?

Spring的事务传播机制用于控制在多个事务方法相互调用时事务的行为。 一、问题解析 在复杂的业务场景中&#xff0c;多个事务方法之间的调用可能会导致事务的不一致&#xff0c;如出现数据丢失、重复提交等问题&#xff0c;使用事务传播机制可以避免这些问题的发生&#xff0c…

面试算法-66-二叉树的层序遍历

题目 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] 解 class Solut…

HTML实现卷轴动画完整源码附注释

动画效果截图 页面的html结构代码 <!DOCTYPE html> <html> <head lang=

golang sync.Map之如何设计一个并发安全的读写分离结构?

在 golang中&#xff0c;想要并发安全的操作map&#xff0c;可以使用sync.Map结构&#xff0c;sync.Map 是一个适合读多写少的数据结构&#xff0c;今天我们来看看它的设计思想&#xff0c;来看看为什么说它适合读多写少的场景。 如下&#xff0c;是golang 中sync.Map的数据结构…

HarmonyOS ArkTS 通用事件(二十三)

通用事件目录 点击事件事件ClickEvent对象说明EventTarget8对象说明示例 触摸事件事件TouchEvent对象说明TouchObject对象说明示例 挂载卸载事件事件示例 点击事件 组件被点击时触发的事件。 事件 ClickEvent对象说明 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中…

MySQL 多表关系(介绍) 一对多/多对多

一对多 举例介绍 例子: 部门与员工 在常理上来说: 一个部门有多个员工&#xff0c;一个员工只对应一个部门实现方式: 在多的一方建立外键&#xff0c;指向一的一方的主键 多对多 举例介绍 例子: 学生与课程 在常理上来说: 一个学生可以有多个课程,一门课程可以有多个学生实…

6.如何判断数据库搜索是否走索引?

判断是否使用索引搜索 索引在数据库中是一个不可或缺的存在&#xff0c;想让你的查询结果快准狠&#xff0c;还是需要索引的来帮忙&#xff0c;那么在mongo中如何判断搜索是不是走索引呢&#xff1f;通常使用执行计划&#xff08;解释计划、Explain Plan&#xff09;来查看查询…