5

我正在尝试用 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 中存在一些围绕多处理的已知错误,但是,在我的情况下,相同的代码适用于较小的子任务,但对于较大的子任务则冻结。

4

1 回答 1

6

您使用的是 Python 2 的某个版本——我们可以通过print拼写方式来判断。

range(1,99999999+addition)创建一个包含至少 1 亿个整数的巨大列表也是如此。您同时在 2 个工作进程中执行此操作。我敢打赌,您的磁盘正在磨成灰尘,而操作系统会换掉它可以换掉的所有东西;-)

更改rangexrange查看会发生什么。我敢打赌它会很好用。

于 2014-01-09T01:40:20.503 回答