mirror of
https://github.com/python/cpython.git
synced 2025-11-25 21:11:09 +00:00
bpo-33097: Fix submit accepting callable after executor shutdown by interpreter exit (GH-6144)
Executors in concurrent.futures accepted tasks after executor was shutdown by interpreter exit. Tasks were left in PENDING state forever. This fix changes submit to instead raise a RuntimeError.
This commit is contained in:
parent
f178028f37
commit
c4b695f85e
4 changed files with 44 additions and 0 deletions
|
|
@ -303,6 +303,34 @@ class ExecutorShutdownTest:
|
|||
self.assertFalse(err)
|
||||
self.assertEqual(out.strip(), b"apple")
|
||||
|
||||
def test_submit_after_interpreter_shutdown(self):
|
||||
# Test the atexit hook for shutdown of worker threads and processes
|
||||
rc, out, err = assert_python_ok('-c', """if 1:
|
||||
import atexit
|
||||
@atexit.register
|
||||
def run_last():
|
||||
try:
|
||||
t.submit(id, None)
|
||||
except RuntimeError:
|
||||
print("runtime-error")
|
||||
raise
|
||||
from concurrent.futures import {executor_type}
|
||||
if __name__ == "__main__":
|
||||
context = '{context}'
|
||||
if not context:
|
||||
t = {executor_type}(5)
|
||||
else:
|
||||
from multiprocessing import get_context
|
||||
context = get_context(context)
|
||||
t = {executor_type}(5, mp_context=context)
|
||||
t.submit(id, 42).result()
|
||||
""".format(executor_type=self.executor_type.__name__,
|
||||
context=getattr(self, "ctx", "")))
|
||||
# Errors in atexit hooks don't change the process exit code, check
|
||||
# stderr manually.
|
||||
self.assertIn("RuntimeError: cannot schedule new futures", err.decode())
|
||||
self.assertEqual(out.strip(), b"runtime-error")
|
||||
|
||||
def test_hang_issue12364(self):
|
||||
fs = [self.executor.submit(time.sleep, 0.1) for _ in range(50)]
|
||||
self.executor.shutdown()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue