我正在尝试使用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中存在一些已知的多处理错误,但在我的情况下,相同的代码适用于较小的子任务,但冻结较大的子任务。
答案 0 :(得分:6)
你正在使用某种版本的Python 2 - 我们可以说明print
是如何拼写的。
所以range(1,99999999+addition)
正在创建一个巨大的列表,至少有1亿个整数。而且你正在同时在2个工作进程中这样做。我打赌你的磁盘会磨损自己的灰尘,同时操作系统可以切换掉所有可能的东西; - )
将range
更改为xrange
,看看会发生什么。我打赌它会正常工作。