summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_asyncio
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2023-10-27 22:44:12 (GMT)
committerGitHub <noreply@github.com>2023-10-27 22:44:12 (GMT)
commitc3bb10c9303503e7b55a7bdf9acfa6b3bcb699c6 (patch)
treea397c4aa0cf90638f08cc987f8e5a5f3aa1f39d3 /Lib/test/test_asyncio
parent1c9a0c40794f0cb3234533d5e83234e7dce4ccd4 (diff)
downloadcpython-c3bb10c9303503e7b55a7bdf9acfa6b3bcb699c6.zip
cpython-c3bb10c9303503e7b55a7bdf9acfa6b3bcb699c6.tar.gz
cpython-c3bb10c9303503e7b55a7bdf9acfa6b3bcb699c6.tar.bz2
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`.
Diffstat (limited to 'Lib/test/test_asyncio')
-rw-r--r--Lib/test/test_asyncio/utils.py11
1 files changed, 8 insertions, 3 deletions
diff --git a/Lib/test/test_asyncio/utils.py b/Lib/test/test_asyncio/utils.py
index 18869b3..44943e1 100644
--- a/Lib/test/test_asyncio/utils.py
+++ b/Lib/test/test_asyncio/utils.py
@@ -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: