Python3与C#并发编程之 进程篇下

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态:(来个草图)

下节预告:案例篇比如分布式进程

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180811G05GMN00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券