2016-05-03 10 views
1

Я создаю 3 процесса с использованием multiprocessing.process и жду их завершения. Если один из них терпит неудачу, я хочу остановить все остальные процессы, а также основную программу. Но когда я использую 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_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 
+0

Большое спасибо. Я попробую это и обновит вас. –

+0

dep_event = Событие() PROC1 = процесс (function1, арг = dep_event) proc1.start в то время как истинного , если dep_event.is_set() == "True",: sys.exit (1) .. .. ..... .... .... function1 (depp_event) .... ... .... depp_event.set() Я тестировал выше кода и по-прежнему не заканчивается основная программа –

+0

@Vinodkumar См. Пример кода, который я добавил. –

Смежные вопросы