我正在尝试理解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
编辑:阅读了一些回复,很明显我不能随意创建许多进程,并希望多处理库为我排队。因此,我的后续问题是如何确定可以同时运行的最大进程数?
答案 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指点我这个方向。