mirror of
https://github.com/python/cpython.git
synced 2025-09-27 18:59:43 +00:00
[3.12] gh-105716: Support Background Threads in Subinterpreters Consistently (gh-109921) (gh-110707)
The existence of background threads running on a subinterpreter was preventing interpreters from getting properly destroyed, as well as impacting the ability to run the interpreter again. It also affected how we wait for non-daemon threads to finish.
We add PyInterpreterState.threads.main, with some internal C-API functions.
(cherry-picked from commit 1dd9dee45d
)
This commit is contained in:
parent
82ae5a609d
commit
0122b4d7c9
11 changed files with 386 additions and 151 deletions
|
@ -37,6 +37,7 @@ _daemon_threads_allowed = _thread.daemon_threads_allowed
|
|||
_allocate_lock = _thread.allocate_lock
|
||||
_set_sentinel = _thread._set_sentinel
|
||||
get_ident = _thread.get_ident
|
||||
_is_main_interpreter = _thread._is_main_interpreter
|
||||
try:
|
||||
get_native_id = _thread.get_native_id
|
||||
_HAVE_THREAD_NATIVE_ID = True
|
||||
|
@ -1566,7 +1567,7 @@ def _shutdown():
|
|||
# the main thread's tstate_lock - that won't happen until the interpreter
|
||||
# is nearly dead. So we release it here. Note that just calling _stop()
|
||||
# isn't enough: other threads may already be waiting on _tstate_lock.
|
||||
if _main_thread._is_stopped:
|
||||
if _main_thread._is_stopped and _is_main_interpreter():
|
||||
# _shutdown() was already called
|
||||
return
|
||||
|
||||
|
@ -1619,6 +1620,7 @@ def main_thread():
|
|||
In normal conditions, the main thread is the thread from which the
|
||||
Python interpreter was started.
|
||||
"""
|
||||
# XXX Figure this out for subinterpreters. (See gh-75698.)
|
||||
return _main_thread
|
||||
|
||||
# get thread-local implementation, either from the thread
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue