我正在尝试使用Python实现多进程。当池化非常快的任务时,它可以正常工作,但是当池化较长的任务时会出现冻结。请看下面的示例:
from multiprocessing import Pool
import math
import time
def iter_count(addition):
print "starting ", addition
for i in range(1,99999999+addition):
if i==99999999:
print "completed ", addition
break
if __name__ == '__main__':
print "starting pooling "
pool = Pool(processes=2)
time_start = time.time()
possibleFactors = range(1,3)
try:
pool.map( iter_count, possibleFactors)
except:
print "exception"
pool.close()
pool.join()
#iter_count(1)
#iter_count(2)
time_end = time.time()
print "total loading time is : ", round(time_end-time_start, 4)," seconds"
在这个例子中,如果我在for循环中使用较小的数字(例如9999999),它可以正常工作。但是当运行99999999时会卡住。我尝试按顺序运行两个进程(
iter_count(1)和iter_count(2)
),大约需要28秒,因此不算一个大任务。但是当我将它们汇集起来时,程序就会挂起。我知道Python中有一些已知的多进程问题,然而,在我的情况下,相同的代码适用于较小的子任务,但对于较大的任务会卡住。
multiprocessing
中的一些已知bug在2.7版本或者之后的2.6.x或2.7.x版本中已经修复了,但是如果你使用的是那些修复之前的版本,显然你仍然会遇到这些bug...而且一般来说,多进程/多线程的bug只会在百万分之一甚至更少的情况下发生,所以如果N通常工作正常,但10N通常失败也不足为奇... - abarnert