mirror of https://github.com/python/cpython
gh-125864: Propagate `pickle.loads()` failures in `InterpreterPoolExecutor` (gh-125898)
Authored-by: Peter Bierma <zintensitydev@gmail.com>
This commit is contained in:
parent
3c4a7fa617
commit
41bd9d959c
|
@ -107,7 +107,8 @@ class WorkerContext(_thread.WorkerContext):
|
|||
|
||||
@classmethod
|
||||
def _call_pickled(cls, pickled, resultsid):
|
||||
fn, args, kwargs = pickle.loads(pickled)
|
||||
with cls._capture_exc(resultsid):
|
||||
fn, args, kwargs = pickle.loads(pickled)
|
||||
cls._call(fn, args, kwargs, resultsid)
|
||||
|
||||
def __init__(self, initdata, shared=None):
|
||||
|
|
|
@ -56,6 +56,16 @@ class InterpretersMixin(InterpreterPoolMixin):
|
|||
return r, w
|
||||
|
||||
|
||||
class PickleShenanigans:
|
||||
"""Succeeds with pickle.dumps(), but fails with pickle.loads()"""
|
||||
def __init__(self, value):
|
||||
if value == 1:
|
||||
raise RuntimeError("gotcha")
|
||||
|
||||
def __reduce__(self):
|
||||
return (self.__class__, (1,))
|
||||
|
||||
|
||||
class InterpreterPoolExecutorTest(
|
||||
InterpretersMixin, ExecutorTest, BaseTestCase):
|
||||
|
||||
|
@ -279,6 +289,14 @@ class InterpreterPoolExecutorTest(
|
|||
self.assertEqual(len(executor._threads), 1)
|
||||
executor.shutdown(wait=True)
|
||||
|
||||
def test_pickle_errors_propagate(self):
|
||||
# GH-125864: Pickle errors happen before the script tries to execute, so the
|
||||
# queue used to wait infinitely.
|
||||
|
||||
fut = self.executor.submit(PickleShenanigans(0))
|
||||
with self.assertRaisesRegex(RuntimeError, "gotcha"):
|
||||
fut.result()
|
||||
|
||||
|
||||
class AsyncioTest(InterpretersMixin, testasyncio_utils.TestCase):
|
||||
|
||||
|
|
Loading…
Reference in New Issue