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方式,适合于集中运算或大并发的状态。


#1 by 下载 on 2010年06月26日 - 20:13
支持喽!博客不错!