python multiprocessing的问题

multiprocessing的是Python2.6中新加入的模块,旨在用类似threading调用tread(线程)的方式使用process(进程)。

服务器中经常需要对大规模的数据进行压缩,传统使用单进程操作不足以体现8核CPU并发的威力。于是写了一个脚本用于多进程压缩。然而在windows的主机上进行调试,全都是死循环,以至于机器都无法进行响应。导入Linux主机,测试却通过。对脚本进行了精简如下:


出错的代码:

from multiprocessing  import Process
#from threading  import Thread

def work(a):
    print "This is : " + str(a) + '\n'
    exit

x = 2

while(x>1):
    p = Process(target=work, args=(x,))
    p.start()
    x -= 1

类似的调用方法,换成threading库是正确的

#from multiprocessing  import Process
from threading  import Thread

def work(a):
    print "This is : " + str(a) + '\n'
    exit

x = 2

while(x>1):
    thread = Thread(target=work, args=(x,))
    thread.start()
    x -= 1

翻阅了官方文档,找到了问题所在:

*Nix平台对于multiprocessing 的实现是基于C库中的fork(),所有子进程与父进程的数据是完全相同,可以说是父进程的完全克隆。
而对于windows,由于windows对于进程的实现方式不同,没有fork()函数,multiprocessing 的调用只能是对于该脚本的重新调用,难怪会出现死循环的问题。

改良后的代码:

from multiprocessing  import Process
#from threading  import Thread

def work(a):
    print "This is : " + str(a) + '\n'
    exit

if __name__ == '__main__' :
    x = 2

    while (x>1):
        p= Process(target=work, args=(x,))
        p.start()
        x -= 1

对于multiprocessing 和 Threading的区别:

Threading的操作只能和父进程在同一个物理CPU上执行。但由于不需要底层的调用,大多数简单的操作效率很高。
multiprocessing的操作可以在多个CPU上执行,但耗费的内存资源也远高于thread方式,适合于集中运算或大并发的状态。

推荐阅读:
Faiss的多线程效率问题

过去的一周,被AI组的同事拉去 Read more

CPU各级缓存

被问起CPU的各级缓存,才想起 Read more

PMU Event counter的使用状况检测

题目用中文反而有点绕,How Read more

AMD Rome benchmark数据到架构特征推导

这几天,拿到了一套最新的AMD Read more

“python multiprocessing的问题”的2个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注

请补全下列算式: *

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据