You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
asyncio's policy system1 has been a source of confusion and problems in asyncio for a very long time. The policies no longer serve a real purpose. Loops are always per thread, there is no need to have a "current loop" when no loop is currently running. This issue discusses the changes to deprecate it in Python 3.14 and schedule its removal in 3.16 or later.
The usual user applications would use the runner APIs (see flowchart) while those who want more control like Jupyter project can create an event loop and manage it themselves, the difference would be that instead of them first getting the policy then event loop then can directly create it like
Functions and classes to be deprecated and later removed
asyncio.get_event_loop_policy
asyncio.set_event_loop_policy
asyncio.AbstractEventLoopPolicy
asyncio.DefaultEventLoopPolicy
asyncio.WindowsSelectorEventLoopPolicy
asyncio.WindowsProactorEventLoopPolicy
asyncio.set_event_loop
Functions to be modified
asyncio.get_event_loop - This will emit warning when creating event loop from policy, later this will become an alias of get_running_loop.
asyncio.new_event_loop - This will emit warning when a custom event loop is used, later this will ignore custom policies.
asyncio.run & asyncio.Runner - In 3.16 or later this will be modified to not use policy system as that will be gone and rely solely on loop_factory.
The Grand Plan
To minimize changes, all the deprecated functions will be underscored i.e. set_event_loop -> _set_event_loop and set_event_loop will emit the warning then call _set_event_loop as its underlying implementation. This way internally asyncio can still call these functions until they are removed without need of many ignore warnings and the tests too can easily be adapted.
The deprecated classes will emit warnings when they are subclassed as it was done for child watchers.
The runner APIs will be remain unmodified but making sure that correct warnings are emitted internally when policy system is used.
The Future
---
title: Flowchart for asyncio.run
---
flowchart TD
A["asyncio.run(coro, loop_factory=...)"] --> B{loop_factory}
B -->|loop_factory is None| D{platform}
B -->|loop_factory is not None| E["loop = loop_factory()"]
D --> |Unix| F["loop = SelectorEventLoop()"]
D --> |Windows| G["loop = ProactorEventLoop()"]
E --> H
F --> H
G --> H
H["loop.run_until_complete(coro)"]
I support the deprecation in general, details are the subject for future discussion.
For example, policies are used by very many libraries. It's better for, e.g., maintainers of pytest-asyncio if we keep the deprecation for 5 Python releases (the issue proposes 2 years).
Let me sleep on other proposed details.
But anyway, I agree we should deprecate policies at least in a very soft form. If we agree on the 5 year deprecation period we can increase the pressure release-to-release
I support the deprecation in general, details are the subject for future discussion. For example, policies are used by very many libraries. It's better for, e.g., maintainers of pytest-asyncio if we keep the deprecation for 5 Python releases (the issue proposes 2 years). Let me sleep on other proposed details. But anyway, I agree we should deprecate policies at least in a very soft form. If we agree on the 5 year deprecation period we can increase the pressure release-to-release
how about in 2 years (2 Python releases so 3.16 or 3.27) we swap the default loop_factory for asyncio.Runner and asyncio.run to loop_factory=asyncio.EventLoop This would allow policy users like pytest-asyncio to continue to use asyncio.get_event_loop() with the policy system, but would move most users off the system
asyncio's policy system deprecation
asyncio's policy system1 has been a source of confusion and problems in asyncio for a very long time. The policies no longer serve a real purpose. Loops are always per thread, there is no need to have a "current loop" when no loop is currently running. This issue discusses the changes to deprecate it in Python 3.14 and schedule its removal in 3.16 or later.
The usual user applications would use the runner APIs (see flowchart) while those who want more control like Jupyter project can create an event loop and manage it themselves, the difference would be that instead of them first getting the policy then event loop then can directly create it like
rather than currently
See these discussions for more background:
Functions and classes to be deprecated and later removed
asyncio.get_event_loop_policy
asyncio.set_event_loop_policy
asyncio.AbstractEventLoopPolicy
asyncio.DefaultEventLoopPolicy
asyncio.WindowsSelectorEventLoopPolicy
asyncio.WindowsProactorEventLoopPolicy
asyncio.set_event_loop
Functions to be modified
asyncio.get_event_loop
- This will emit warning when creating event loop from policy, later this will become an alias ofget_running_loop
.asyncio.new_event_loop
- This will emit warning when a custom event loop is used, later this will ignore custom policies.asyncio.run
&asyncio.Runner
- In 3.16 or later this will be modified to not use policy system as that will be gone and rely solely on loop_factory.The Grand Plan
set_event_loop
->_set_event_loop
andset_event_loop
will emit the warning then call_set_event_loop
as its underlying implementation. This way internally asyncio can still call these functions until they are removed without need of many ignore warnings and the tests too can easily be adapted.The Future
Footnotes
https://docs.python.org/3.14/library/asyncio-policy.html ↩
The text was updated successfully, but these errors were encountered: