我正在尝试理解 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
编辑:阅读了一些回复后,很明显我不能随意创建许多进程,并希望多处理库为我排队。所以我的后续问题是如何确定我可以同时运行的最大进程数?
我设法克服了挂起 PC 的大量进程。它似乎适用于相当多的进程(我测试了多达 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 为我指明了这个方向。
我是一名优秀的程序员,十分优秀!