Python3与C#并发编程之 进程实战篇

进程篇就这么结束了,下次说说线程、并发+协程

1.6.进程间状态共享

应该尽量避免进程间状态共享,但需求在那,所以还是得研究,官方推荐了两种方式:

1.共享内存( or )

之前说过 :在 之间使用没问题,用到 ,就使用 , 和 ,就不太一样了:

看看源码:(Manager里面的Array和Process共享的Array不是一个概念,而且也没有同步机制)

以 为例看看怎么用:

输出:( 和 是 安全的)

类型方面的对应关系:

这两个类型其实是 类型,更多的类型可以去 查看,来张图:

回头解决 的时候会用到 系列或者 系列的共享库(讲线程的时候会说)

关于进程安全的补充说明:对于原子性操作就不用说,铁定安全,但注意一下 并不是原子性操作:

输出:(理论上应该是:5×1000=5000)

稍微改一下才行:(进程安全:只是提供了安全的方法,并不是什么都不用你操心了

输出:(关于锁这块,后面讲线程的时候会详说,看看就好【语法的确比C#麻烦点】)

看看源码:(之前探讨如何优雅的杀死子进程,其中就有一种方法使用了 )

扩展部分可以查看这篇文章:http://blog.51cto.com/11026142/1874807

2.服务器进程( )

官方文档:https://docs.python.org/3/library/multiprocessing.html#managers

有一个服务器进程负责维护所有的对象,而其他进程连接到该进程,通过代理对象操作服务器进程当中的对象

通过返回的经理 将支持类型

举个简单例子(后面还会再说):(本质其实就是 )

输出:

服务器进程管理器比使用共享内存对象更灵活,因为它们可以支持任意对象类型。此外,单个管理器可以通过网络在不同计算机上的进程共享。但是,它们比使用共享内存慢(毕竟有了 )

同步问题依然需要注意一下,举个例子体会一下:

扩展补充:

是一个进程安全对象,因此您可以将其直接传递给子进程并在所有进程中安全地使用它。

大多数可变Python对象(如list,dict,大多数类)不能保证进程中安全,所以它们在进程间共享时需要使用

多进程模式的缺点是创建进程的代价大,在 系统下,用 调用还行,在 下创建进程开销巨大。

Manager这块官方文档很详细,可以看看:https://docs.python.org/3/library/multiprocessing.html#managers

的可以参考这篇 or 这篇埋坑记(Manager一般都是部署在Linux的,Win的客户端不影响)

扩展补充

还记得之前的:无法将multiprocessing.Queue对象传递给Pool方法吗?其实一般都是这两种方式解决的:

使用Manager需要生成另一个进程来托管Manager服务器。 并且所有获取/释放锁的调用都必须通过IPC发送到该服务器。

使用初始化程序在池创建时传递常规 这将使 实例在所有子进程中全局共享

再看一下Pool的 方法:

第一种方法不够轻量级,在讲案例前,稍微说下第二种方法:(也算把上面留下的悬念解了)

输出:(就是在初始化Pool的时候,传了初始化执行的方法并传了参数: )

Win下亦通用(win下没有 )

1.7.分布式进程的案例

有了 的基础,咱们来个例子练练:

的缩略图:

服务器端代码:

客户端代码1:

客户端代码2:

输出图示:

服务器运行在Linux的测试:

其实还有一部分内容没说,明天得出去办点事,先到这吧,后面找机会继续带一下

参考文章:

进程共享的探讨:python-sharing-a-lock-between-processes

多进程锁的探讨:trouble-using-a-lock-with-multiprocessing-pool-pickling-error

JoinableQueue扩展:https://www.cnblogs.com/smallmars/p/7093603.html

Python多进程编程:https://www.cnblogs.com/kaituorensheng/p/4445418.html

有深度但需要辩证看的两篇文章:

跨进程对象共享:http://blog.ftofficer.com/2009/12/python-multiprocessing-3-about-queue

关于Queue:http://blog.ftofficer.com/2009/12/python-multiprocessing-2-object-sharing-across-process

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

扫码关注云+社区

领取腾讯云代金券