饭饱之后,继续研究multiprocessing的设计实现。建议大家抽时间都看下常用的库的源码,常常会有意外的收获。  比如我这边发现multiprocessing Pool的构造函数有个叫maxtasksperchild参数。 我查了文档,又对应了代码,终于整明白是啥个意思。

该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。

http://xiaorui.cc/?p=2901


一个python pool进程池的例子…


maxtasksperchild本意是每个进程最大的任务量,如果你maxtasksperchild = 2, 那么他每次干完两个任务后,就会spawn一个新的进程。

可以防止某个进程内存泄露被oom,这样可以通过原始kill进程的方式回收内存资源。

下面我们看下multiprocessing pool maxtasksperchild的相关实现源码. 

测试的python代码我就不写了, 下面我们看结果multiprocessing pool maxtasksperchild的结果.  每隔一段时间除了主进程的pid不变,其他由主进程spawn的子进程在不停的变换pid。

以前写过一个超级蛋疼的业务程序。说多了都是泪,因为程序连接了不同的cursor数据并导入到有序字典里,所以造成了内存越来越大。 专业点的说法是内存泄露。总之不能资源回收了。  后来搞了一套类似Master Worker的进程管理模块才搞定。 如果有人问我 为什么不直接解决内存泄露及回收资源的bug, 我…. 无话可说…   老代码,老坑.

如果早知道multiprocessing有maxtasksperchild的实现,就不用这么麻烦了。

END.



对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!!
{ 2000人qq大群内有各厂大牛,常组织线上分享及沙龙,对高性能及分布式场景感兴趣同学欢迎加入该QQ群 }

另外如果大家觉得文章对你有些作用!   帮忙点击广告. 一来能刺激我写博客的欲望,二来好维护云主机的费用.
如果想赏钱,可以用微信扫描下面的二维码. 另外再次标注博客原地址  xiaorui.cc  ……   感谢!

python下multiprocessing和gevent的组合使用

对于有些人来说Gevent和multiprocessing组合在一起使用算是个又高大上又奇葩的工作模式.   Python的多线程受制于GIL全局锁的特性,Gevent身为协...

阅读全文

理解python的multiprocessing.pool threadpool多线程

起因,我用多线程去用访问elasticsearch api时候,想拿到es返回的search结果。 默认python threading是不能获取返回的结果的。 有这么几种方式可以取到多线...

阅读全文

python multiprocessing之间的通信性能测试 Pipe vs Queue

今天12306的数据库爆出来了,午饭过后,自己搞了个针对12306密码查询的小api,结果影响有些大,VPS都挂了好几次 !  搞得哥们很是销魂呀 !  后来...

阅读全文

发表评论