Issue 20980: In multiprocessing.pool, ExceptionWithTraceback should derive from Exception (original) (raw)
In multiprocessing.pool, ExceptionWithTraceback is not derived from Exception. Thus when it is raised, we get the exception, "TypeError: exceptions must derive from BaseException". Attached is a patch that fixes this.
See below example traceback that prompted me to notice this:
Traceback (most recent call last): File "/Users/myint/Library/Python/3.4/bin/yolk", line 9, in load_entry_point('yolk3k==0.7.3', 'console_scripts', 'yolk')() File "/Users/myint/Library/Python/3.4/lib/python/site-packages/yolk/cli.py", line 1123, in main my_yolk.run() File "/Users/myint/Library/Python/3.4/lib/python/site-packages/yolk/cli.py", line 208, in run return getattr(self, action)() File "/Users/myint/Library/Python/3.4/lib/python/site-packages/yolk/cli.py", line 240, in show_updates for (project_name, version, newest) in _updates(pkg_list, self.pypi): File "/Users/myint/Library/Python/3.4/lib/python/site-packages/yolk/cli.py", line 1104, in _updates names): File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/pool.py", line 255, in map return self._map_async(func, iterable, mapstar, chunksize).get() File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/pool.py", line 594, in get raise self._value TypeError: exceptions must derive from BaseException
I didn't quite understand the multiprocessing test cases, but attached is a standalone test case that reproduces the problem. The problem only shows up when using ThreadPool.
$ python thread_pool_exception_test.py Traceback (most recent call last): File "thread_pool_exception_test.py", line 7, in pool.map(exception, [1]) File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/pool.py", line 255, in map return self._map_async(func, iterable, mapstar, chunksize).get() File "/opt/local/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/multiprocessing/pool.py", line 594, in get raise self._value TypeError: exceptions must derive from BaseException