<p>经理工作正常(包括len())。代码的问题在于,在主进程中,您不会等到处理结束,因此主进程结束,管理器不再可访问。我也不知道ListProxy的pop原子性,所以也许一个锁会很方便。</p>
<p>解决方案是<code>p.join()</code>。</p>
<p>然而,我很困惑,为什么在<code>doFirstMP</code>结尾处做<code>p.join</code>就足够了。如果有人能解释为什么在完成所有计算之后,而不是在第一个doMP返回之后,第一个p返回join,我会很高兴。</p>
<p>我的代码:</p>
<pre><code>import time, random
from multiprocessing import Process, Manager
class MP_Stuff():
def __init__(self, parent, id):
time.sleep(1 + random.random()*5) # simulate data processing
print id , "done"
parent.killMP(id)
class ParamHandler():
def doFirstMP(self, IDs):
self.mps_in_process = []
self.ID_List = Manager().list(IDs)
id = self.ID_List.pop(0)
p = Process(target=MP_Stuff, args=(self, id))
self.mps_in_process.append(id)
p.start()
p.join()
print "joined"
def doMP(self):
for tmp in range(3): # nr of concurrent processes
print self.ID_List
if len(self.ID_List) > 0:
id = self.ID_List.pop(0)
p = Process(target=MP_Stuff, args=(self, id))
self.mps_in_process.append(id)
p.start()
def killMP(self, kill_id):
print "kill", kill_id
self.mps_in_process.remove(kill_id)
self.doMP()
if __name__ == '__main__':
ID_List = [1,2,3,4,5,6]
paramSet = ParamHandler()
paramSet.doFirstMP(ID_List)
</code></pre>