summaryrefslogtreecommitdiffstats
path: root/Lib/multiprocessing
diff options
context:
space:
mode:
authorRichard Oudkerk <shibturn@gmail.com>2013-05-06 10:38:25 (GMT)
committerRichard Oudkerk <shibturn@gmail.com>2013-05-06 10:38:25 (GMT)
commit8575783a00a6fc7ef9cb754df90532b178de2fb3 (patch)
tree20f726521104969868978503e8f5da420ce2555c /Lib/multiprocessing
parent53683f6f4bc53a0ffad923a0e056e488dc7dbb6f (diff)
downloadcpython-8575783a00a6fc7ef9cb754df90532b178de2fb3.zip
cpython-8575783a00a6fc7ef9cb754df90532b178de2fb3.tar.gz
cpython-8575783a00a6fc7ef9cb754df90532b178de2fb3.tar.bz2
Issue #13813: Embed stringification of remote traceback in local
traceback raised when pool task raises an exception.
Diffstat (limited to 'Lib/multiprocessing')
-rw-r--r--Lib/multiprocessing/pool.py25
1 files changed, 25 insertions, 0 deletions
diff --git a/Lib/multiprocessing/pool.py b/Lib/multiprocessing/pool.py
index c0aa717..82a2923 100644
--- a/Lib/multiprocessing/pool.py
+++ b/Lib/multiprocessing/pool.py
@@ -18,6 +18,7 @@ import queue
import itertools
import collections
import time
+import traceback
from multiprocessing import Process, cpu_count, TimeoutError
from multiprocessing.util import Finalize, debug
@@ -43,6 +44,29 @@ def starmapstar(args):
return list(itertools.starmap(args[0], args[1]))
#
+# Hack to embed stringification of remote traceback in local traceback
+#
+
+class RemoteTraceback(Exception):
+ def __init__(self, tb):
+ self.tb = tb
+ def __str__(self):
+ return self.tb
+
+class ExceptionWithTraceback:
+ def __init__(self, exc, tb):
+ tb = traceback.format_exception(type(exc), exc, tb)
+ tb = ''.join(tb)
+ self.exc = exc
+ self.tb = '\n"""\n%s"""' % tb
+ def __reduce__(self):
+ return rebuild_exc, (self.exc, self.tb)
+
+def rebuild_exc(exc, tb):
+ exc.__cause__ = RemoteTraceback(tb)
+ return exc
+
+#
# Code run by worker processes
#
@@ -90,6 +114,7 @@ def worker(inqueue, outqueue, initializer=None, initargs=(), maxtasks=None):
try:
result = (True, func(*args, **kwds))
except Exception as e:
+ e = ExceptionWithTraceback(e, e.__traceback__)
result = (False, e)
try:
put((job, i, result))