2014-10-08 2 views
0

У меня есть пул процессов в python с использованием from multiprocessing import Pool. Я передаю этим процессам различные функции для запуска, вызывая функцию Pool.apply_async. Если я введу ошибку в одну из этих функций (например: строка кода, например 5/0), ожидаемый отчет командной строки ZeroDivisionError: integer division or modulo by zero никогда не появляется, и программа никогда не заканчивается. Даже если я введу функцию обратного вызова при вызове Pool.apply_async, функция обратного вызова никогда не будет вызвана, если функция, которую должен выполнить процесс, имеет ошибку.Процессы в многопроцессорной обработке. Не сообщают об ошибках времени выполнения

Как я могу обрабатывать эти процессы в отчетах пула и прекращать работу, если что-то пойдет не так?

ответ

3

Вы должны реально попытаться get результат с AsyncResult возвращенного apply_async (или map_async) за исключением быть поднят в родителе.

def func(): 
    raise Exception("We failed") 

... 
result = pool.apply_async(func, args=(arg)) 
time.sleep(2) 
result.get() # Exception only gets raised here 

Любой callback вы предоставите только выполняется, если функция успешно возвращает. Он пропускается, если возникает исключение.

В Python 3.2+ был введен аргумент ключевого слова error_callback, который позволяет передавать обратный вызов, который выполняется, если в рабочем процессе создается исключение, но вы не можете сделать это в Python 2.x. Что вы можете сделать, это использовать обернуть функцию уборщица в try/except блок, который возвращает любое исключение, в рабочем, а не поднимать его:

def func(): 
    try: 
     raise Exception("We failed") 
    except Exception as e: 
     return e 

Тогда вы можете иметь нормальную функцию обратного вызова, которая проверяет, см., если был возвращен Exception:

def callback(result): 
    if isinstance(result, Exception): 
     # Do whatever you need to do to clean up and exit 
    else: 
     # Function was successful 
+0

Отлично подходит для информации. Большое спасибо! Я предполагаю, что я перейду на python 3.2, чтобы сделать вещи проще. –

+0

@ASDF Я бы порекомендовал идти к 3.4, если возможно (это намного более новый), но да, Python 3.x облегчит вам жизнь. Если это не слишком много для переноса вашей программы, пойдите для нее. – dano