summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKumar Aditya <59607654+kumaraditya303@users.noreply.github.com>2022-11-14 18:18:51 (GMT)
committerGitHub <noreply@github.com>2022-11-14 18:18:51 (GMT)
commitf63002755d3b7c0bb2e452f158769f19fcf3b850 (patch)
treee5d4dd832ee63f246a72bcc78a9dda88fad4e262
parentf5e326e2b6b3f008ed71ccf9e6c3e18a6618ea45 (diff)
downloadcpython-f63002755d3b7c0bb2e452f158769f19fcf3b850.zip
cpython-f63002755d3b7c0bb2e452f158769f19fcf3b850.tar.gz
cpython-f63002755d3b7c0bb2e452f158769f19fcf3b850.tar.bz2
GH-99388: add `loop_factory` parameter to `asyncio.run` (#99462)
-rw-r--r--Doc/library/asyncio-runner.rst14
-rw-r--r--Doc/whatsnew/3.12.rst5
-rw-r--r--Lib/asyncio/runners.py4
-rw-r--r--Lib/test/test_asyncio/test_runners.py10
-rw-r--r--Misc/NEWS.d/next/Library/2022-11-14-08-21-56.gh-issue-99388.UWSlwp.rst2
5 files changed, 29 insertions, 6 deletions
diff --git a/Doc/library/asyncio-runner.rst b/Doc/library/asyncio-runner.rst
index c43d664..b68b257 100644
--- a/Doc/library/asyncio-runner.rst
+++ b/Doc/library/asyncio-runner.rst
@@ -22,7 +22,7 @@ to simplify async code usage for common wide-spread scenarios.
Running an asyncio Program
==========================
-.. function:: run(coro, *, debug=None)
+.. function:: run(coro, *, debug=None, loop_factory=None)
Execute the :term:`coroutine` *coro* and return the result.
@@ -37,9 +37,11 @@ Running an asyncio Program
debug mode explicitly. ``None`` is used to respect the global
:ref:`asyncio-debug-mode` settings.
- This function always creates a new event loop and closes it at
- the end. It should be used as a main entry point for asyncio
- programs, and should ideally only be called once.
+ If *loop_factory* is not ``None``, it is used to create a new event loop;
+ otherwise :func:`asyncio.new_event_loop` is used. The loop is closed at the end.
+ 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.
The executor is given a timeout duration of 5 minutes to shutdown.
If the executor hasn't finished within that duration, a warning is
@@ -62,6 +64,10 @@ Running an asyncio Program
*debug* is ``None`` by default to respect the global debug mode settings.
+ .. versionchanged:: 3.12
+
+ Added *loop_factory* parameter.
+
Runner context manager
======================
diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst
index d30e419..bb08e44 100644
--- a/Doc/whatsnew/3.12.rst
+++ b/Doc/whatsnew/3.12.rst
@@ -217,6 +217,11 @@ asyncio
and will be removed in Python 3.14.
(Contributed by Kumar Aditya in :gh:`94597`.)
+* Add *loop_factory* parameter to :func:`asyncio.run` to allow specifying
+ a custom event loop factory.
+ (Contributed by Kumar Aditya in :gh:`99388`.)
+
+
pathlib
-------
diff --git a/Lib/asyncio/runners.py b/Lib/asyncio/runners.py
index b1c4dbd..1b89236 100644
--- a/Lib/asyncio/runners.py
+++ b/Lib/asyncio/runners.py
@@ -157,7 +157,7 @@ class Runner:
raise KeyboardInterrupt()
-def run(main, *, debug=None):
+def run(main, *, debug=None, loop_factory=None):
"""Execute the coroutine and return the result.
This function runs the passed coroutine, taking care of
@@ -190,7 +190,7 @@ def run(main, *, debug=None):
raise RuntimeError(
"asyncio.run() cannot be called from a running event loop")
- with Runner(debug=debug) as runner:
+ with Runner(debug=debug, loop_factory=loop_factory) as runner:
return runner.run(main)
diff --git a/Lib/test/test_asyncio/test_runners.py b/Lib/test/test_asyncio/test_runners.py
index 1308b7e..811cf8b 100644
--- a/Lib/test/test_asyncio/test_runners.py
+++ b/Lib/test/test_asyncio/test_runners.py
@@ -257,6 +257,16 @@ class RunTests(BaseTest):
with self.assertRaises(asyncio.CancelledError):
asyncio.run(main())
+ def test_asyncio_run_loop_factory(self):
+ factory = mock.Mock()
+ loop = factory.return_value = self.new_loop()
+
+ async def main():
+ self.assertEqual(asyncio.get_running_loop(), loop)
+
+ asyncio.run(main(), loop_factory=factory)
+ factory.assert_called_once_with()
+
class RunnerTests(BaseTest):
diff --git a/Misc/NEWS.d/next/Library/2022-11-14-08-21-56.gh-issue-99388.UWSlwp.rst b/Misc/NEWS.d/next/Library/2022-11-14-08-21-56.gh-issue-99388.UWSlwp.rst
new file mode 100644
index 0000000..f35799d
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-11-14-08-21-56.gh-issue-99388.UWSlwp.rst
@@ -0,0 +1,2 @@
+Add *loop_factory* parameter to :func:`asyncio.run` to allow specifying a custom event loop factory.
+Patch by Kumar Aditya.