当进程数增加时,多处理会挂起

时间:2013-05-20 19:11:36

标签: python multiprocessing

我正在尝试理解python中的多处理。

我做了一个测试程序,从一组列表中找到最大数量。 它适用于有限数量的进程,但是如果我将数量增加到5000个进程,程序就会挂起。

我做错了吗?如果我增加进程数,它为什么会挂起?

这是我的代码:

from  multiprocessing import Process, Manager
import numpy.random as npyrnd

def getMaxRand(_num, shared_dict):
    '''
    create a list of random numbers
    picks max from list
    '''
    print 'starting process num:', _num
    rndList = npyrnd.random(size= 100)
    maxrnd = max(rndList)
    print 'ending process:', _num
    shared_dict[_num] = maxrnd



if __name__ == '__main__':
    processes = []
    manager = Manager()
    shared_dict= manager.dict()  
    for i in range(50): #hangs when this is increased to say 5000
        p = Process(target=getMaxRand, args=( i, shared_dict))
        processes.append(p)
    for p in processes:
        p.start()
    for p in processes:
        p.join()


    print shared_dict
编辑:阅读了一些回复,很明显我不能随意创建许多进程,并希望多处理库为我排队。因此,我的后续问题是如何确定可以同时运行的最大进程数?

1 个答案:

答案 0 :(得分:2)

我设法克服了挂在我电脑上的大量进程。 它似乎适用于相当多的进程(我测试了高达50000)

这就是我解决问题的方法:

from  multiprocessing import  Pool
import numpy.random as npyrnd


full_result = {}

def getMaxRand(_num):
    '''
    create a list of random numbers
    picks max from list
    '''
    print 'starting process num:', _num
    rndList = npyrnd.random(size= 100)
    maxrnd = max(rndList)
    print 'ending process:', _num

    return (_num, maxrnd)

def accumulateResults(result):
    print 'getting result' , result
    full_result[result[0]] = result[1]

def doProcesses():
    pool = Pool(processes=8)    
    for i in range(5000): #if I increase this number will it crash?
        pool.apply_async(getMaxRand, args=( i, ), callback=accumulateResults)
    pool.close()
    pool.join()



if __name__ == '__main__':
    doProcesses()
    print 'FINAL:', full_result

感谢@mgilson和@Kylo指点我这个方向。