diff options
author | Thomas Grainger <tagrain@gmail.com> | 2023-10-12 14:13:57 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-10-12 14:13:57 (GMT) |
commit | 8c6c14b91bf95e04018151c53bce6e27e0e22447 (patch) | |
tree | 10032d3467d24b4ef7d490173b10ae3bc9f28b5e | |
parent | 1e3460d9faaffb35b3c6175c666b1f45aea2c1d8 (diff) | |
download | cpython-8c6c14b91bf95e04018151c53bce6e27e0e22447.zip cpython-8c6c14b91bf95e04018151c53bce6e27e0e22447.tar.gz cpython-8c6c14b91bf95e04018151c53bce6e27e0e22447.tar.bz2 |
gh-94597: Add asyncio.EventLoop (#110723)
This is needed to pave the way for deprecating and eventually killing the event loop policy system (which is over-engineered and rarely used).
-rw-r--r-- | Doc/library/asyncio-eventloop.rst | 16 | ||||
-rw-r--r-- | Doc/library/asyncio-runner.rst | 2 | ||||
-rw-r--r-- | Lib/asyncio/unix_events.py | 2 | ||||
-rw-r--r-- | Lib/asyncio/windows_events.py | 3 | ||||
-rw-r--r-- | Lib/test/test_asyncio/test_runners.py | 11 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2023-10-11-15-07-21.gh-issue-94597.NbPC8t.rst | 1 |
6 files changed, 30 insertions, 5 deletions
diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index 04af53b..361e7bb 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -1686,13 +1686,13 @@ Event Loop Implementations asyncio ships with two different event loop implementations: :class:`SelectorEventLoop` and :class:`ProactorEventLoop`. -By default asyncio is configured to use :class:`SelectorEventLoop` -on Unix and :class:`ProactorEventLoop` on Windows. +By default asyncio is configured to use :class:`EventLoop`. .. class:: SelectorEventLoop - An event loop based on the :mod:`selectors` module. + A subclass of :class:`AbstractEventLoop` based on the + :mod:`selectors` module. Uses the most efficient *selector* available for the given platform. It is also possible to manually configure the @@ -1714,7 +1714,7 @@ on Unix and :class:`ProactorEventLoop` on Windows. .. class:: ProactorEventLoop - An event loop for Windows that uses "I/O Completion Ports" (IOCP). + A subclass of :class:`AbstractEventLoop` for Windows that uses "I/O Completion Ports" (IOCP). .. availability:: Windows. @@ -1723,6 +1723,14 @@ on Unix and :class:`ProactorEventLoop` on Windows. `MSDN documentation on I/O Completion Ports <https://docs.microsoft.com/en-ca/windows/desktop/FileIO/i-o-completion-ports>`_. +.. class:: EventLoop + + An alias to the most efficient available subclass of :class:`AbstractEventLoop` for the given + platform. + + It is an alias to :class:`SelectorEventLoop` on Unix and :class:`ProactorEventLoop` on Windows. + + .. versionadded:: 3.13 .. class:: AbstractEventLoop diff --git a/Doc/library/asyncio-runner.rst b/Doc/library/asyncio-runner.rst index b68b257..ec170df 100644 --- a/Doc/library/asyncio-runner.rst +++ b/Doc/library/asyncio-runner.rst @@ -42,6 +42,8 @@ Running an asyncio Program This function should be used as a main entry point for asyncio programs, and should ideally only be called once. It is recommended to use *loop_factory* to configure the event loop instead of policies. + Passing :class:`asyncio.EventLoop` allows running asyncio without the + policy system. The executor is given a timeout duration of 5 minutes to shutdown. If the executor hasn't finished within that duration, a warning is diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index 28cef96..65f0923 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -32,6 +32,7 @@ __all__ = ( 'FastChildWatcher', 'PidfdChildWatcher', 'MultiLoopChildWatcher', 'ThreadedChildWatcher', 'DefaultEventLoopPolicy', + 'EventLoop', ) @@ -1510,3 +1511,4 @@ class _UnixDefaultEventLoopPolicy(events.BaseDefaultEventLoopPolicy): SelectorEventLoop = _UnixSelectorEventLoop DefaultEventLoopPolicy = _UnixDefaultEventLoopPolicy +EventLoop = SelectorEventLoop diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py index c9a5fb8..4a4c4be 100644 --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -29,7 +29,7 @@ from .log import logger __all__ = ( 'SelectorEventLoop', 'ProactorEventLoop', 'IocpProactor', 'DefaultEventLoopPolicy', 'WindowsSelectorEventLoopPolicy', - 'WindowsProactorEventLoopPolicy', + 'WindowsProactorEventLoopPolicy', 'EventLoop', ) @@ -894,3 +894,4 @@ class WindowsProactorEventLoopPolicy(events.BaseDefaultEventLoopPolicy): DefaultEventLoopPolicy = WindowsProactorEventLoopPolicy +EventLoop = ProactorEventLoop diff --git a/Lib/test/test_asyncio/test_runners.py b/Lib/test/test_asyncio/test_runners.py index 1eb5641..13493d3 100644 --- a/Lib/test/test_asyncio/test_runners.py +++ b/Lib/test/test_asyncio/test_runners.py @@ -3,6 +3,7 @@ import asyncio import contextvars import re import signal +import sys import threading import unittest from test.test_asyncio import utils as test_utils @@ -272,6 +273,16 @@ class RunTests(BaseTest): asyncio.run(main(), loop_factory=factory) factory.assert_called_once_with() + def test_loop_factory_default_event_loop(self): + async def main(): + if sys.platform == "win32": + self.assertIsInstance(asyncio.get_running_loop(), asyncio.ProactorEventLoop) + else: + self.assertIsInstance(asyncio.get_running_loop(), asyncio.SelectorEventLoop) + + + asyncio.run(main(), loop_factory=asyncio.EventLoop) + class RunnerTests(BaseTest): diff --git a/Misc/NEWS.d/next/Library/2023-10-11-15-07-21.gh-issue-94597.NbPC8t.rst b/Misc/NEWS.d/next/Library/2023-10-11-15-07-21.gh-issue-94597.NbPC8t.rst new file mode 100644 index 0000000..6874c61 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2023-10-11-15-07-21.gh-issue-94597.NbPC8t.rst @@ -0,0 +1 @@ +Added :class:`asyncio.EventLoop` for use with the :func:`asyncio.run` *loop_factory* kwarg to avoid calling the asyncio policy system. |