新闻详情

新闻详情

首页 / 资讯中心 / 详情

Python multiprocessing多进程原理与应用示例

发布时间:2026/10/1 11:54:00来源:尧图网络
Python multiprocessing多进程原理与应用示例
多进程原理与应用示例更新时间为二零一九年二月二十八日十四点三十分十五秒, 作者是牧野。这篇文章主要介绍了多进程原理与应用, 它结合了具体的实例形式, 对基于包的多进程概念进行了详细的分析, 深入讲解了其核心原理以及相关的实际操作技巧, 有需要的用户可以参考这些内容。本文实例主要是讲述多进程原理与应用的事情, 现在分享给大家来供大家参考, 具体内容如下:包里面的多进程管理包, 可以利用那个对象来创建进程, 这个对象上面, 是有这些方法的, 比如说启动方法, 还有join方法, run方法, 以及启动方法。该模块的核心功能, 就是把管理进程变得和管理线程那样轻松顺手, 因为每一个进程都拥有自己独立的GIL, 所以就不会出现进程相互争抢GIL的情况, 这样一来, 在多核CPU运行环境下, 能够把执行运行的效率给大幅度地提升上去。这是使用这个功能的例子。import multiprocessingimport timeimport cv2def daemon1(image):name multiprocessing.current_process().namefor i in range(50):image cv2.GaussianBlur(image, (3, 3), 1)time.sleep(0.1)print daemon1 done!cv2.imshow(daemon1, image)def daemon2(image):name multiprocessing.current_process().namefor i in range(50):image cv2.GaussianBlur(image, (3, 3), 1)time.sleep(0.5)print daemon2 done!cv2.imshow(daemon2, image)if __name__ __main__:t1 time.time()number_kernel multiprocessing.cpu_count()print We have {0} kernels.format(number_kernel)p1 multiprocessing.Process(namedaemon1,targetdaemon1,args (cv2.imread(./p1.jpg),))p1.daemon Falsep2 multiprocessing.Process(namedaemon2,targetdaemon2, args(cv2.imread(./p2.jpg),))p2.daemon Falsep1.start()p2.start()print p1 is {0}.format(p1.is_alive())p1.terminate()p1.join()print p1 is {0}.format(p1.is_alive())print p2 is {0}.format(p2.is_alive())p2.join()t2 time.time()print !!!!!!!!!!!!!!!!!!!!OK!!!!!!!!!!!!!!!!!!!!!print total time is {0}.format(t2-t1)print p1.exitcode {0}.format(p1.exitcode)print p2.exitcode {0}.format(p2.exitcode)“中”这里指的是一个类别, 它的作用是用来创建进程, 同时还包含了定义进程相关方法的功能, 该类所对应的构造函数形式如下:def __init__(self, groupNone, targetNone, nameNone, args(), kwargs{})这个地方的参数指的是啥意思呢?程序解读在中使用pool如果需要进行操作的是多个子进程, 那么采用进程池的方式进行统一管控, 会对每个子进程实施自动化管理, 这样的做法显然是更加便利且高效的。from multiprocessing import Poolimport os, timedef long_time_task(name):print Run task {0} ({1}).format(name,os.getpid())start time.time()time.sleep(3)end time.time()print Task {0} runs {1:.2f} seconds..format(name,end - start)if __name____main__:print Parent process ({0}).format(os.getpid)p Pool()for i in range(12):p.apply_async(long_time_task, args(i,))print Waiting for all subprocesses done...p.close()p.join()print All subprocesses done.跟通过类的实例化方法来创建进程的方式不一样, Pool是借由func,args(args)这种办法来生成进程的。在每一个进程池里面, 能够并行处理的任务数量等于咱们这台机器上面所有CPU核心的总数目。要是弄出来的子进程的数量超过了这个上限, 那么在同一时间里, 就只允许有那一个个数的进程在执行。只有当里面的某一个进程把活儿干完了以后, 才会去启动后续的下一个进程。存在多个子进程, 而这些多个子进程之间需要互相通信。在多个子进程进行通信的时候, 是需要使用到.Queue的, .Queue的特点在于它是一个消息队列。比方说存在如下需求, 也就是有一个实例表现为一个子进程向队列里边写入数据, 而另一个进程从该队列里面获取数据这样的情况。from multiprocessing import Process, Queueimport os, time, randomdef write(q):for value in [A, B, C]:print Put {0} to queue....format(value)q.put(value)time.sleep(random.random())def read(q):while True:if not q.empty():value q.get(True)print Get {0} from queue..format(value)time.sleep(random.random())else:breakif __name____main__:q multiprocessing.Queue()pw Process(targetwrite, args(q,))pr Process(targetread, args(q,))pw.start()pw.join()pr.start()pr.join()Queue的使用方法, 是这样子的。如果在进程池Pool中尝试使用Queue, 是会出错的, 所以, 应该改用那个带有点号的.Queue才行。from multiprocessing import Process, Queueimport os, time, randomdef write(q):for value in [A, B, C]:print Put {0} to queue....format(value)q.put(value)time.sleep(random.random())def read(q):while True:if not q.empty():value q.get(True)print Get {0} from queue..format(value)time.sleep(random.random())else:breakif __name____main__:manager multiprocessing.Manager()q manager.Queue()p Pool()pw p.apply_async(write, args(q,))time.sleep(2)pr p.apply_async(read, args(q,))p.close()p.join()if not q.empty():print q is not empty...else:print q is empty...print OKif not q.empty():print q is not empty...else:print q is empty...print done...父进程与子进程共享内存定义普通的变量不能实现在父进程和子进程之间共享import multiprocessingfrom multiprocessing import Pooldef changevalue(n, a):n 3.14a[0] 5if __name__ __main__:num 0arr range(10)p Pool()p1 p.apply_async(changevalue, args(num, arr))p.close()p.join()print numprint arr[:]导致最终输出的 num 的数值, 依然是由父进程那边定义的 0, 同时 arr 的第一个元素的值, 也依旧是 0。使用那个, 来把共享的这个对象进行创建的。import multiprocessingdef changevalue(n, a):n.value 3.14a[0] 5if __name__ __main__:num multiprocessing.Value(d, 0.0)arr multiprocessing.Array(i, range(10))p multiprocessing.Process(targetchangevalue, args(num, arr))p.start()p.join()print num.valueprint arr[:]最终输出的结果是num这个变量的值被修改成了3.14, 而这个修改的动作发生在子进程内部。与此同时, arr数组里的第一个元素值也被更改为了数字5。共享内存是在那个叫做pool的地方进行使用的, 具体的情况说明如下面所说的一样。import multiprocessingfrom multiprocessing import Pooldef changevalue(n, a):n.value 3.14a[0] 5if __name__ __main__:num multiprocessing.Value(d, 0.0)arr multiprocessing.Array(i, range(10))p Pool()p1 p.apply_async(changevalue, args(num, arr))p.close()p.join()print num.valueprint arr[:]更多关于相关内容感兴趣的读者可查看本站专题《进程与线程操作技巧总结》、《数据结构与算法教程》、《函数使用技巧总结》、《字符串操作技巧汇总》、《入门与进阶经典教程》、《MySQL数据库程序设计入门教程》及《常见数据库操作技巧汇总》本人希望在此文本中所阐述的相关内容, 能够对各位朋友在程序设计的方面, 带来一定的、并且是有益的参考与帮助。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

古文机器翻译实战:seq2seq+attention源码包的数据管道与避坑指南 2026/10/1 13:26:45

古文机器翻译实战:seq2seq+attention源码包的数据管道与避坑指南

简介:这是一套基于Python开发的古文到现代文机器翻译项目源码,面向毕业设计、课程设计与项目开发场景,尤其适合有一定Python基础、希望在NLP翻译方向快速落地参考实现的开发者。项目源码已经过严格测试,可直接运行并在此基础上扩展…

阅读更多 →
数据库被注入木马后恢复:用TaoToken统一Key排查异常连接与数据回滚 2026/10/1 13:26:38

数据库被注入木马后恢复:用TaoToken统一Key排查异常连接与数据回滚

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
RK3576启动链深度解析:Maskrom与Loader协同机制 2026/10/1 13:26:38

RK3576启动链深度解析:Maskrom与Loader协同机制

1. 项目概述:RK3576“变砖”不是玄学,是启动链上某个环节的彻底失联你手里的RK3576开发板突然不亮灯、不识别USB、串口无任何输出——连最基础的AT指令都喂不进去,烧写工具报错“device not found”或“no response”,这时候圈内人…

阅读更多 →
EtherCAT与FSoE实战:从分布式时钟同步到安全通信,以H5U带24轴为例 2026/10/1 13:26:37

EtherCAT与FSoE实战:从分布式时钟同步到安全通信,以H5U带24轴为例

说句实在话,EtherCAT 这个名字在工控圈里已经不算新鲜了,但真正把它吃透的人并不多。很多做 PLC 的老工程师最开始对它的态度是怀疑的——以太网嘛,传传文件、连个电脑还行,拿来控制伺服轴,周期能稳吗?直到…

阅读更多 →
01背包压维实战:从二维MLE到一维倒序,彻底解决空间与效率问题 2026/10/1 13:26:31

01背包压维实战:从二维MLE到一维倒序,彻底解决空间与效率问题

先问你一个问题:如果一道01背包题目的物品数量是5000,背包容量是10000,你会怎么写状态数组?很多人的第一反应还是dp[5001][10001],然后提交,然后MLE。即使内存侥幸过关,时间也往往卡在超时边缘。…

阅读更多 →
航拍校园操场人体检测:YOLO数据集构建与训练全流程实战 2026/10/1 13:26:31

航拍校园操场人体检测:YOLO数据集构建与训练全流程实战

1. 航拍视角下的人体检测,到底难在哪里先把场景说清楚。航拍校园操场人体检测,指的是用无人机或者高位固定摄像头,从几十米到上百米的高度俯拍操场、跑道、球场这类开阔场地,然后在画面里把每一个人框出来。听起来跟普通的目标检测…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉