2012-04-17 53 views
3

我正在用多進程使用python的多處理庫進行蒙特卡洛模擬。這些過程基本上可以猜出某個對象,並且如果它符合某些條件,它將被添加到共享列表中。如果此列表符合某些條件,我的計算就完成了。Python多處理:向所有進程發信號的最快方法?

我當前的代碼如下所示:(無僞不重要的細節)

mgr = Manager() 
ns = mgr.Namespace() 
ns.mylist = [] 
ns.othersharedstuff = x 
killsig = mgr.Event() 
processes = [ MyProcess(ns, killsig) for _ in range(8) ] 
for p in processes: p.start() 
for p in processes: p.join() 
get data from ns.mylist() 

def MyProcess.run(self): 
    localdata = y 
    while not killsig.is_set(): 
     x = guessObject() 
     if x.meetsCondition(): 
      add x to ns.mylist and put local data into ns() 
      if ns.mylist meets condition: 
       killsig.set() 
    put local data into ns() 

當我更換「而不是killsig.is_set():」有「而真正的:」我的模擬速度增加大約25%! (除了它當然不會終止)

有沒有比使用信號更快的方法?如果每個進程的非同步本地數據都丟失並不重要,那麼涉及到process.terminate()的內容也可以。

回答

3

既然您已經擁有了所有子流程列表的原始流程,爲何不使用它來終止流程?我想象這樣的事情:

ns.othersharedstuff = x 
killsig = mgr.Event() 
processes = [ MyProcess(ns, killsig) for _ in range(8) ] 
for p in processes: p.start() 
while not killsig.isSet(): 
    time.sleep(0.01) # 10 milliseconds 
for p in processes: p.terminate() 
get data from ns.mylist() 

然後,你可以設置while循環while true: