爲此,您需要在工作進程和主進程之間進行通信。可能最簡單的方法是使用multiprocessing.Event
。
之前啓動過程中,創建一對multiprocessing.Event
。給他們有意義的名字,如stop_main
和stop_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
非常感謝。我會嘗試這個並更新你。 –
dep_event =事件() PROC1 =處理(功能1,ARGS = dep_event) proc1.start 而真 如果dep_event.is_set()== 「真」: sys.exit(1) .. .. ..... .... .... 功能1(depp_event) .... ... .... depp_event.set() 我測試上面的代碼,仍然不會結束主程序 –
@Vinodkumar請參閱我添加的示例代碼。 –