-
-
Save agronholm/5a8a2773b82369195a308c910566070a to your computer and use it in GitHub Desktop.
| import asyncio | |
| import atexit | |
| from contextlib import ExitStack | |
| from anyio.from_thread import start_blocking_portal | |
| exit_stack = ExitStack() | |
| portal = exit_stack.enter_context(start_blocking_portal()) | |
| atexit.register(exit_stack.close) | |
| portal.call(asyncio.sleep, 1) |
A bug in CPython?
I think I see the problem. start_blocking_portal() is using a concurrent.futures.ThreadPoolExecutor behind the scenes, and these started using non-daemonic threads in Python 3.9, so atexit callbacks aren't run, leading to a deadlock. I'll need to make it use plain daemonic Thread instead for consistency.
I think I see the problem.
start_blocking_portal()is using aconcurrent.futures.ThreadPoolExecutorbehind the scenes, and these started using non-daemonic threads in Python 3.9, soatexitcallbacks aren't run, leading to a deadlock. I'll need to make it use plain daemonicThreadinstead for consistency.
Nothing is ever as easy as it should be! 😅 I'm glad you could see the root cause as debugging that was definitely outside my experience/expertise!
I only tested this on Python 3.8, and it seems to hang on any later version.