summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Grainger <tagrain@gmail.com>2023-10-12 14:13:57 (GMT)
committerGitHub <noreply@github.com>2023-10-12 14:13:57 (GMT)
commit8c6c14b91bf95e04018151c53bce6e27e0e22447 (patch)
tree10032d3467d24b4ef7d490173b10ae3bc9f28b5e
parent1e3460d9faaffb35b3c6175c666b1f45aea2c1d8 (diff)
downloadcpython-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.rst16
-rw-r--r--Doc/library/asyncio-runner.rst2
-rw-r--r--Lib/asyncio/unix_events.py2
-rw-r--r--Lib/asyncio/windows_events.py3
-rw-r--r--Lib/test/test_asyncio/test_runners.py11
-rw-r--r--Misc/NEWS.d/next/Library/2023-10-11-15-07-21.gh-issue-94597.NbPC8t.rst1
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.