gh-110205: Fix asyncio ThreadedChildWatcher._join_threads() (#110884)

- `ThreadedChildWatcher.close()` is now *officially* a no-op; `_join_threads()` never did anything.
- Threads created by that class are now named `asyncio-waitpid-NNN`.
- `test.test_asyncio.utils.TestCase.close_loop()` now waits for the child watcher's threads, but not forever; if a thread hangs, it raises `RuntimeError`.
This commit is contained in:
Guido van Rossum 2023-10-27 15:44:12 -07:00 committed by GitHub
parent 1c9a0c4079
commit c3bb10c930
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 10 additions and 12 deletions

View file

@ -546,6 +546,7 @@ class TestCase(unittest.TestCase):
else:
loop._default_executor.shutdown(wait=True)
loop.close()
policy = support.maybe_get_event_loop_policy()
if policy is not None:
try:
@ -557,9 +558,13 @@ class TestCase(unittest.TestCase):
pass
else:
if isinstance(watcher, asyncio.ThreadedChildWatcher):
threads = list(watcher._threads.values())
for thread in threads:
thread.join()
# Wait for subprocess to finish, but not forever
for thread in list(watcher._threads.values()):
thread.join(timeout=support.SHORT_TIMEOUT)
if thread.is_alive():
raise RuntimeError(f"thread {thread} still alive: "
"subprocess still running")
def set_event_loop(self, loop, *, cleanup=True):
if loop is None: