打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python 多进程实践

限时干货下载:

回复【2】免费获取【超全数据分析资料免费下载(包含SQL,R语言,SPSS,SAS,python,数据挖掘)!】

链接:segmentfault.com/a/1190000003044986

作者:Yi_Zhi_Yu


多进程的方式可以增加脚本的并发处理能力, python 支持这种多进程的编程方式

在类unix系统中, pythonos 模块内置了fork 函数用以创建子进程


fork 方式创建子进程



执行结果


从结果可以看到, 从pid = os.fork() 开始, 下面的部分代码运行了两次, 第一次是父进程运行, 第二次是子进程运行, 且子进程的fork的结果总是0, 所以这个也可以用来作为区分父进程或是子进程标志


那么变量在多个进程之间是否相互影响呢
import os



很明显, 初始值为10source 在父进程中值 减少了 1, 为9, 而子进程明显source的初始值 是10, 也就是说多进程之间并没有什么相互影响


multiprocessing 方式创建子进程


fork 方式是仅在linux 下才有的接口, 在windows下并没有, 那么在windows下如何实现多进程呢, 这就用到了multiprocessing


multiprocessing 模块的Process 对象表示的是一个进程对象, 可以创建子进程并执行制定的函数




执行结果


如果没有pro.join(), 则表示非阻塞方式运行, 那么最终的Process end的输出位置就有可能出现在pro_do 方法执行之前了



通过multiprocessingprocess对象创建多进程, 还可以从主进程中向子进程传递参数, 例如上面例子中的pro_do的参数


Pool 进程池



输出:


其中


是立即输出的, 后面的依次在等待了sleep的时间后输出 , 之所以立即输出了上面两个是因为Pool 进程池默认是按照cpu的数量开启子进程的, 我是在虚拟机中运行, 只分配了两核, 所以先立即启动两个子进程, 剩下的进程要等到前面的进程执行完成后才能启动。


不过也可以在p=Poo() 中使用Pool(5)来指定启动的子进程数量, 这样输出就是下面的了:




都是立即输出的


进程间的通信


父进程可以指定子进程执行的方法及其参数, 达到父进程向子进程传递消息的单向通信的目的, 那子进程之间或子进程怎么向父进程通信呢


Queue




结果


Pipe


另外还有Pipe


其原理参见http://ju.outofmemory.cn/entry/106041, 其只能作为两个进程之间的通信



在实例化Pipe的时候, 会产生两个ps_pipe(read-write Connection, handle 5), pr_pipe(read-write Connection, handle 5) , 都可以作为发送或者接受方, 一旦一个确认为攻, 另一个自然就是受了(之所以Pipe只能作为两个进程之间的通信方式, 原因也许就是这个),产生的结果如下


还有一种Array, Value 的形式, 暂且不表, 有时间在折腾

以上均为python 学习笔记和练习, 如有错误, 欢迎指出


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
刚开始学习的小白学Python,他对线程和进程的理解让我非常惊讶!
Python多进程写入同一文件
python中一个变量是如何穿梭于多线程与多进程?
Linux 文件系统(三)
多进程
Python实现多进程的四种方式!详细介绍
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服