网易首页 > 网易号 > 正文 申请入驻

python支持的两种并发方式

0
分享至

Python支持的并发分为多线程并发与多进程并发(异步IO本文不涉及)。概念上来说,多进程并发即运行多个独立的程序,优势在于并发处理的任务都由操作系统管理,不足之处在于程序与各进程之间的通信和数据共享不方便;多线程并发则由程序员管理并发处理的任务,这种并发方式可以方便地在线程间共享数据(前提是不能互斥)。Python对多线程和多进程的支持都比一般编程语言更高级,最小化了需要我们完成的工作。

一.多进程并发

Mark Summerfield指出,对于计算密集型程序,多进程并发优于多线程并发。计算密集型程序指的程序的运行时间大部分消耗在CPU的运算处理过程,而硬盘和内存的读写消耗的时间很短;相对地,IO密集型程序指的则是程序的运行时间大部分消耗在硬盘和内存的读写上,CPU的运算时间很短。

对于多进程并发,python支持两种实现方式,一种是采用进程安全的数据结构:multiprocessing.JoinableQueue,这种数据结构自己管理“加锁”的过程,程序员无需担心“死锁”的问题;python还提供了一种更为优雅而高级的实现方式:采用进程池。下面一一介绍。

1.队列实现——使用multiprocessing.JoinableQueue

multiprocessing是python标准库中支持多进程并发的模块,我们这里采用multiprocessing中的数据结构:JoinableQueue,它本质上仍是一个FIFO的队列,它与一般队列(如queue中的Queue)的区别在于它是多进程安全的,这意味着我们不用担心它的互斥和死锁问题。JoinableQueue主要可以用来存放执行的任务和收集任务的执行结果。举例来看(以下皆省去导入包的过程):

对于windows系统的多进程并发,程序文件里必须含有“入口函数”(如main函数),且结尾处必须调用入口点。例如以if __name__ == '__main__': main()结尾。

在这个最简单的多进程并发例子里,我们用多进程实现将26个字母打印出来。首先定义一个存放任务的JoinableQueue对象,然后实例化两个Process对象(每个对象对应一个子进程),实例化Process对象需要传送target和args参数,target是实现每个任务工作中的具体函数,args是target函数的参数。

这两句话将子进程设置为守护进程——主进程结束后随之结束。

一旦运行到这两句话,子进程就开始独立于父进程运行了,它会在单独的进程里调用target引用的函数——在这里即read函数,它是一个死循环,将参数q中的数一一读取并打印出来。

这是多进程并发的要点,q是一个JoinableQueue对象,支持get方法读取第一个元素,如果q中没有元素,进程就会阻塞,直至q中被存入新元素。

因此执行完pw1.start() pw2.start()这两句话后,子进程虽然开始运行了,但很快就堵塞住。

将26个字母依次放入JoinableQueue对象中,这时候两个子进程不再阻塞,开始真正地执行任务。两个子进程都用value = q.get()来读取数据,它们都在修改q对象,而我们并不用担心同步问题,这就是multiProcessing.Joinable数据结构的优势所在——它是多进程安全的,它会自动处理“加锁”的过程。

q.join()方法会查询q中的数据是否已读完——这里指的就是任务是否执行完,如果没有,程序会阻塞住等待q中数据读完才开始继续执行(可以用Ctrl+C强制停止)。

对Windows系统,调用任务管理器应该可以看到有多个子进程在运行。

2.进程池实现——使用concurrent.futures.ProcessPoolExecutor

Python还支持一种更为优雅的多进程并发方式,直接看例子:

这里我们采用concurrent.futures.ProcessPoolExecutor对象,可以把它想象成一个进程池,子进程往里“填”。我们通过submit方法实例一个Future对象,然后把这里Future对象都填到池——futures里,这里futures是一个set对象。只要进程池里有future,就会开始执行任务。这里的read函数更为简单——只是把一个字符打印并休眠一会而已。

这是等待所有子进程都执行完毕。子进程执行过程中可能抛出异常,err = future.exception()可以收集这些异常,便于后期处理。

可以看出用Future对象处理多进程并发更为简洁,无论是target函数的编写、子进程的启动等等,future对象还可以向使用者汇报其状态,也可以汇报执行结果或执行时的异常。

二.多线程并发

对于IO密集型程序,多线程并发可能要优于多进程并发。因为对于网络通信等IO密集型任务来说,决定程序效率的主要是网络延迟,这时候是使用进程还是线程就没有太大关系了。

1.队列实现——使用queue.Queue

程序与多进程基本一致,只是这里我们不必使用multiProcessing.JoinableQueue对象了,一般的队列(来自queue.Queue)就可以满足要求:

并且这里我们实例化的是Thread对象,而不是Process对象,程序的其余部分看起来与多进程并没有什么两样。

2. 线程池实现——使用concurrent.futures.ThreadPoolExecutor

直接看例子:

用ThreadPoolExecutor与用ProcessPoolExecutor看起来没什么区别,只是改了一下签名而已。

不难看出,不管是使用队列还是使用进/线程池,从多进程转化到多线程是十分容易的——仅仅是修改了几个签名而已。当然内部机制完全不同,只是python的封装非常好,使我们可以不用关心这些细节,这正是python优雅之处。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
88岁老戏骨住养老院近况曝光!好友带香蕉探望,独享双人房环境好

88岁老戏骨住养老院近况曝光!好友带香蕉探望,独享双人房环境好

阿芒娱乐说
2024-04-26 11:41:25
曝何超莲窦骁已分居!两人未进行婚姻登记,婚前婚后互动差距大

曝何超莲窦骁已分居!两人未进行婚姻登记,婚前婚后互动差距大

萌神木木
2024-04-25 20:29:53
天津一公安派出所所长因公牺牲,享年53岁

天津一公安派出所所长因公牺牲,享年53岁

新京报北京知道
2024-04-25 20:07:33
“保密真要命”!安省夫妇喜中7000万巨奖,永远不搬家,装修厨房

“保密真要命”!安省夫妇喜中7000万巨奖,永远不搬家,装修厨房

宝哥精彩赛事
2024-04-26 11:58:11
15年前,湖南夫妇生下“小猴娃”,差点被杂技团买走,现在咋样了

15年前,湖南夫妇生下“小猴娃”,差点被杂技团买走,现在咋样了

文文爸育儿
2024-04-25 12:42:57
汪小菲父亲汪玺赴台,S妈认怂,大S的好日子到头,评论区炸开锅了

汪小菲父亲汪玺赴台,S妈认怂,大S的好日子到头,评论区炸开锅了

娱乐八卦木木子
2024-04-25 17:11:57
谁在帮助俄罗斯逃避制裁?

谁在帮助俄罗斯逃避制裁?

影视解说阿相
2024-04-25 07:24:24
为什么亲人会渐行渐远,看懂李叔同的三句话,就通透了

为什么亲人会渐行渐远,看懂李叔同的三句话,就通透了

布衣粗食68
2024-04-25 15:28:31
12分大败!25分惨败!超级三巨头恐遭一轮游,全联盟最强防守诞生

12分大败!25分惨败!超级三巨头恐遭一轮游,全联盟最强防守诞生

康泳哥看体育
2024-04-26 12:39:27
高层住宅在苏联时期已经证明是一个巨大的骗局,不适合兴建居住!

高层住宅在苏联时期已经证明是一个巨大的骗局,不适合兴建居住!

前沿科技学习分享圈
2024-04-20 13:56:38
重返英超!曝中超第一人离队,放弃千万高薪,奥斯卡将加盟阿森纳

重返英超!曝中超第一人离队,放弃千万高薪,奥斯卡将加盟阿森纳

夏侯看英超
2024-04-26 11:56:12
那一夜,我在女领导家过夜,她的柔情让我难以抗拒

那一夜,我在女领导家过夜,她的柔情让我难以抗拒

社会潜伏者
2024-04-25 23:33:38
如果全听了毛主席的话,我的人生会更好

如果全听了毛主席的话,我的人生会更好

书中自有颜如玉
2024-04-23 01:49:00
俄媒:国防部副部长伊万诺夫被捕是叛国罪!纳瓦尔尼团队披露细节

俄媒:国防部副部长伊万诺夫被捕是叛国罪!纳瓦尔尼团队披露细节

项鹏飞
2024-04-25 15:14:34
匈牙利外长:中国电动汽车“产能过剩”纯属谬论

匈牙利外长:中国电动汽车“产能过剩”纯属谬论

环球网资讯
2024-04-25 08:37:40
尘埃落定,卡纳瓦罗重回中超?下家曝光,官宣合同,里皮发声担保

尘埃落定,卡纳瓦罗重回中超?下家曝光,官宣合同,里皮发声担保

东球弟
2024-04-26 15:14:37
奚梦瑶晒上海豪宅,重装欧式宫廷风显大气,豪宅角落太脏全是灰尘

奚梦瑶晒上海豪宅,重装欧式宫廷风显大气,豪宅角落太脏全是灰尘

娱小小新
2024-04-26 15:09:12
回访|市民要求深圳燃气公司提供更多数据

回访|市民要求深圳燃气公司提供更多数据

人民资讯
2024-04-25 19:18:06
悬崖边上的哈马斯:是坐以待毙,还是断臂求生?

悬崖边上的哈马斯:是坐以待毙,还是断臂求生?

中国新闻周刊
2024-04-24 15:47:14
四川小伙从不上班,日入990万到处买别墅,奢侈品多到无处下脚

四川小伙从不上班,日入990万到处买别墅,奢侈品多到无处下脚

观案宝鉴
2024-04-18 19:00:03
2024-04-26 15:46:44
钟爱科技
钟爱科技
一个爱科技的九零后
6文章数 50680关注度
往期回顾 全部

科技要闻

中国车企“五常”激战北京车展

头条要闻

为抗议美国对加沙政策 美国务院发言人辞职

头条要闻

为抗议美国对加沙政策 美国务院发言人辞职

体育要闻

库里当选最佳关键球员 10项数据联盟第一

娱乐要闻

金靖回应不官宣恋情结婚的原因

财经要闻

24年后再产纯净水 农夫山泉为何要打自己脸

汽车要闻

2024北京车展 比亚迪的自驱力让对手紧追猛赶

态度原创

游戏
亲子
健康
时尚
家居

腾讯《剑灵》怀旧服已上线!原汁原味还原经典版本

亲子要闻

初三女生遭两次霸凌试图割喉求生引众怒:罚的还是太轻了!

这2种水果可降低高血压死亡风险

减龄又清爽的夏季穿搭!爱美女人照着搭配真好看,优雅显气质

家居要闻

光影之间 空间暖意打造生活律动

无障碍浏览 进入关怀版