2

我正在尝试理解 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

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

4

1 回答 1

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 为我指明了这个方向。

于 2013-05-21T14:10:12.437 回答