2016-05-03 41 views
1

我使用multiprocessing.process產生3個進程並等待它們完成。如果其中一個失敗,那麼我想停止所有其他進程和主程序。但是當我使用sys.exit時,執行只是停止進程而不是主程序。這是代碼片段。如何從python中的多重處理進程中退出主程序

proc1=process(function1) 
proc2=process(function2) 
proc3=process(function3) 
proc1.start 
proc2.start 
proc3.start 
proc1.join 
proc2.join 
proc3.join 

。 。 。

我正在運行1,2和3函數的一些任務。我有一個條件在每個函數來檢查任務的返回碼,如果返回碼不成功,那麼我想停止proc1,proc2和proc3和停止執行主程序。當我在函數內部執行sys.exit時,它只是從該進程中出來,而不是主程序。

回答

1

爲此,您需要在工作進程和主進程之間進行通信。可能最簡單的方法是使用multiprocessing.Event

之前啓動過程中,創建一對multiprocessing.Event。給他們有意義的名字,如stop_mainstop_workers。爲便於攜帶,您應該將這些Event s添加到針對Process目標的參數中。

當主程序退出時,工作進程應該調用stop_main.set()。工作流程還應定期致電stop_workers.is_set(),並在返回True時退出。

主流程啓動所有工人後,應該繼續輪詢stop_main.is_set()。當返回True時,應該撥打stop_workers.set(),join工作人員並退出。

更新時間:

編輯,以使其更短,並希望使其在MS-Windows工作。

一個例子:

import multiprocessing as mp 
import time 


def worker(num, sw, sm): 
    if num == 5: 
     print('This is worker', num) 
     time.sleep(1) 
     print('Worker', num, 'signalling main program to quit') 
     sm.set() 
    while not sw.is_set(): 
     print('This is worker', num) 
     time.sleep(0.7) 
    else: 
     print('Worker', num, 'signing off..') 


if __name__ == '__main__': 
    stop_worker = mp.Event() 
    stop_main = mp.Event() 

    workers = [mp.Process(target=worker, args=(n, stop_worker, stop_main)) 
       for n in range(1, 6)] 
    for w in workers: 
     w.start() 
    while not stop_main.is_set(): 
     time.sleep(1) 
    print('MAIN: Received stop event') 
    print('MAIN: Sending stop event to workers') 
    stop_worker.set() 
    for c, w in enumerate(workers, start=1): 
     w.join() 
     print('worker', c, 'joined') 

它運行是這樣的:

This is worker 1 
This is worker 2 
This is worker 3 
This is worker 4 
This is worker 5 
This is worker 2 
This is worker 3 
This is worker 1 
This is worker 4 
Worker 5 signalling main program to quit 
This is worker 5 
This is worker 2 
This is worker 3 
This is worker 1 
This is worker 4 
This is worker 5 
MAIN: Received stop event 
MAIN: Sending stop event to workers 
Worker 3 signing off.. 
Worker 1 signing off.. 
Worker 2 signing off.. 
worker 1 joined 
worker 2 joined 
worker 3 joined 
Worker 4 signing off.. 
worker 4 joined 
Worker 5 signing off.. 
worker 5 joined 
+0

非常感謝。我會嘗試這個並更新你。 –

+0

dep_event =事件() PROC1 =處理(功能1,ARGS = dep_event) proc1.start 而真 如果dep_event.is_set()== 「真」: sys.exit(1) .. .. ..... .... .... 功能1(depp_event) .... ... .... depp_event.set() 我測試上面的代碼,仍然不會結束主程序 –

+0

@Vinodkumar請參閱我添加的示例代碼。 –