1.5.进程间通信~PIPE管道通信
multiprocessing.Pipe源码分析
pool.join源码分析
1.5.进程间通信~Queue管道通信(常用)
引入案例
源码拓展
进程间通信1
进程间通信2
进程拓展
1.上下文系
2.日记系列
3.进程5态
1.5.进程间通信~PIPE管道通信
这个比较有意思,看个案例:
结果:
multiprocessing.Pipe源码分析
按照道理应该子进程自己写完自己读了,和上次讲得不一样啊?不急,先看看源码:
看看 方法的定义部分,是不是双向通信就看你是否设置
通过源码知道了,原来双工是通过socket搞的啊~
再看个和原来一样效果的案例:(不用关来关去的了,方便!)
输出:(可以思考下为什么 ,提示: )
再举个 的例子,咱们就进入今天的重点了:
输出:
pool.join源码分析
看看源码就理解了:看看Pool的join是啥情况?看源码:
在pool的 的方法中,这几个属性:
将池进程的数量增加到指定的数量,join的时候会使用这个列表
1.5.进程间通信~Queue管道通信(常用)
一步步的设局,从底层的的 -> -> ,现在终于到 了,心酸啊,明知道上面两个项目
里面基本上不会用,但为了你们能看懂源码,说了这么久 其实以后当我们从 说到 和 之后,现在
讲得这些进程间通信( )也基本上不会用了,但本质你得清楚,我尽量多分析点源码,这样你们以后看开源项目压力会很小
欢迎批评指正~
引入案例
输出:( 和 默认是阻塞等待的)
源码拓展
先看看 的初始化方法:(不指定大小就是最大队列数)
关于 和 是阻塞的问题,看下源码探探究竟:
:收消息
:发消息
非阻塞 和 本质其实也是调用了 和 方法:
进程间通信1
说这么多不如来个例子看看:
输出:
补充说明一下:
队列数(尽量不用 开头的属性和方法)
查看当前队列中存在几条消息
查看是否满了
查看是否为空
再看个简单点的子进程间通信:(铺垫demo)
输出:( )
进程间通信2
多进程基本上都是用 ,可用上面说的 方法怎么报错了?
输出:(队列对象不能在父进程与子进程间通信)
下面会详说,先看一下正确方式:(队列换了一下,其他都一样 )
输出:
进程拓展
官方参考:https://docs.python.org/3/library/multiprocessing.html
1.上下文系
spawn:(Win默认,Linux下也可以用【>=3.4】)
父进程启动一个新的python解释器进程。
子进程只会继承运行进程对象run()方法所需的那些资源。
不会继承父进程中不必要的文件描述符和句柄。
与使用fork或forkserver相比,使用此方法启动进程相当慢。
可在Unix和Windows上使用。Windows上的默认设置。
fork:(Linux下默认)
父进程用于os.fork()分叉Python解释器。
子进程在开始时与父进程相同(这时候内部变量之类的还没有被修改)
父进程的所有资源都由子进程继承(用到多线程的时候可能有些问题)
仅适用于Unix。Unix上的默认值。
forkserver:(常用)
当程序启动并选择forkserver start方法时,将启动服务器进程。
从那时起,每当需要一个新进程时,父进程就会连接到服务器并请求它分叉一个新进程。
fork服务器进程是单线程的,因此它可以安全使用os.fork()。没有不必要的资源被继承。
可在Unix平台上使用,支持通过Unix管道传递文件描述符。
这块官方文档很详细,贴下官方的2个案例:
通过 来设置启动的上下文类型
输出:( 不要过多使用)
如果你把设置启动上下文注释掉:(消耗的总时间少了很多)
也可以通过 获取指定类型的上下文
输出:( 在Python源码里用的比较多,so=>也建议大家这么用)
从结果来看,总耗时也少了很多
2.日记系列
说下日记相关的事情:
先看下 里面的日记记录:
更多 模块内容可以看官方文档:https://docs.python.org/3/library/logging.html
这个是内部代码,看看即可:
之前也有提过,可以看看:https://www.cnblogs.com/dotnetcrazy/p/9333792.html#2.装饰器传参的扩展(可传可不传)
来个案例:
输出:
3.进程5态
之前忘记说了~现在快结尾了,补充一下进程5态:(来个草图)
下节预告:案例篇比如分布式进程
领取专属 10元无门槛券
私享最新 技术干货