python多处理冻结

her*_*mos 5 python pool multiprocess python-2.7

我试图用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"
Run Code Online (Sandbox Code Playgroud)

在这个例子中,如果我在for循环中使用较小的数字(类似9999999)它可以工作.但是当它运行99999999时会冻结.我尝试按顺序运行两个进程(iter_count(1)iter_count(2)),大约需要28秒,所以不是一个大任务.但是当我把它们汇集起来时它会冻结.我知道python中存在一些已知的多处理错误,但在我的情况下,相同的代码适用于较小的子任务,但冻结较大的子任务.

Tim*_*ers 6

你正在使用某些版本的Python 2 - 我们可以告诉你,因为print拼写是如何拼写的.

所以range(1,99999999+addition)创建一个巨大的列表,至少有1亿个整数.而且你正在同时在2个工作进程中这样做.我打赌你的磁盘正在磨损自己的灰尘,而操作系统可以将所有东西都换掉;-)

更改rangexrange看看会发生什么.我打赌它会正常工作.

  • 它与计算无关:它与峰值内存使用完全相关.而你的程序并没有冻结,它只是因为你没有内存而非常慢地运行**.当你连续执行它们时,它需要一半的RAM.那你很幸运.那些巨大的列表需要千兆字节的RAM.`xrange`给你一个迭代器而不是一个巨大的列表,并且需要少量的RAM.这里的所有都是它的. (6认同)