Tôi có một giải pháp hợp lý cho vấn đề này, ít nhất là cho mục đích gỡ lỗi. Tôi hiện không có giải pháp nào sẽ làm tăng ngoại lệ trở lại trong các quy trình chính. Suy nghĩ đầu tiên của tôi là sử dụng một trang trí, nhưng bạn chỉ có thể chọn functions defined at the top level of a module, vì vậy điều đó đúng.
Thay vào đó, một lớp gói đơn giản và một lớp con Hồ bơi sử dụng lớp này cho apply_async
(và do đó apply
). Tôi sẽ để lại map_async
làm bài tập cho người đọc.
import traceback
from multiprocessing.pool import Pool
import multiprocessing
# Shortcut to multiprocessing's logger
def error(msg, *args):
return multiprocessing.get_logger().error(msg, *args)
class LogExceptions(object):
def __init__(self, callable):
self.__callable = callable
def __call__(self, *args, **kwargs):
try:
result = self.__callable(*args, **kwargs)
except Exception as e:
# Here we add some debugging help. If multiprocessing's
# debugging is on, it will arrange to log the traceback
error(traceback.format_exc())
# Re-raise the original exception so the Pool worker can
# clean up
raise
# It was fine, give a normal answer
return result
class LoggingPool(Pool):
def apply_async(self, func, args=(), kwds={}, callback=None):
return Pool.apply_async(self, LogExceptions(func), args, kwds, callback)
def go():
print(1)
raise Exception()
print(2)
multiprocessing.log_to_stderr()
p = LoggingPool(processes=1)
p.apply_async(go)
p.close()
p.join()
này mang lại cho tôi:
1
[ERROR/PoolWorker-1] Traceback (most recent call last):
File "mpdebug.py", line 24, in __call__
result = self.__callable(*args, **kwargs)
File "mpdebug.py", line 44, in go
raise Exception()
Exception
Nguồn
2011-10-06 17:23:57
Tôi đã gặp vấn đề tương tự. Nguyên nhân là như sau: quy trình công nhân bắt ngoại lệ và đặt một mã lỗi và ngoại lệ trên hàng đợi kết quả. Quay trở lại quá trình chính, luồng xử lý kết quả của Pool nhận mã lỗi và chỉ bỏ qua nó. Một số loại chế độ gỡ lỗi khỉ vá có thể là có thể. Một giải pháp thay thế sẽ là đảm bảo chức năng công nhân của bạn bắt bất kỳ ngoại lệ nào, trả về nó và một mã lỗi cho trình xử lý của bạn để in. –
Điều này đã được trả lời ở đây: http://stackoverflow.com/a/26096355/512111 – j08lue