mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
[3.12] gh-113964: Don't prevent new threads until all non-daemon threads exit (GH-116677) (#117029)
Starting in Python 3.12, we prevented calling fork() and starting new threads
during interpreter finalization (shutdown). This has led to a number of
regressions and flaky tests. We should not prevent starting new threads
(or `fork()`) until all non-daemon threads exit and finalization starts in
earnest.
This changes the checks to use `_PyInterpreterState_GetFinalizing(interp)`,
which is set immediately before terminating non-daemon threads.
(cherry picked from commit 60e105c1c1
)
This commit is contained in:
parent
4be9fa8961
commit
92564331de
8 changed files with 57 additions and 27 deletions
|
@ -4840,20 +4840,21 @@ class ForkTests(unittest.TestCase):
|
|||
self.assertEqual(err.decode("utf-8"), "")
|
||||
self.assertEqual(out.decode("utf-8"), "")
|
||||
|
||||
def test_fork_at_exit(self):
|
||||
def test_fork_at_finalization(self):
|
||||
code = """if 1:
|
||||
import atexit
|
||||
import os
|
||||
|
||||
def exit_handler():
|
||||
pid = os.fork()
|
||||
if pid != 0:
|
||||
print("shouldn't be printed")
|
||||
|
||||
atexit.register(exit_handler)
|
||||
class AtFinalization:
|
||||
def __del__(self):
|
||||
print("OK")
|
||||
pid = os.fork()
|
||||
if pid != 0:
|
||||
print("shouldn't be printed")
|
||||
at_finalization = AtFinalization()
|
||||
"""
|
||||
_, out, err = assert_python_ok("-c", code)
|
||||
self.assertEqual(b"", out)
|
||||
self.assertEqual(b"OK\n", out)
|
||||
self.assertIn(b"can't fork at interpreter shutdown", err)
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue