]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-127949: deprecate `asyncio.set_event_loop` (#128218)
authorKumar Aditya <kumaraditya@python.org>
Tue, 24 Dec 2024 13:54:28 +0000 (19:24 +0530)
committerGitHub <noreply@github.com>
Tue, 24 Dec 2024 13:54:28 +0000 (19:24 +0530)
Deprecate `asyncio.set_event_loop` to be removed in Python 3.16.

16 files changed:
Doc/library/asyncio-eventloop.rst
Lib/asyncio/__main__.py
Lib/asyncio/events.py
Lib/asyncio/runners.py
Lib/test/test_asyncgen.py
Lib/test/test_asyncio/functional.py
Lib/test/test_asyncio/test_base_events.py
Lib/test/test_asyncio/test_events.py
Lib/test/test_asyncio/test_futures.py
Lib/test/test_asyncio/test_streams.py
Lib/test/test_asyncio/test_tasks.py
Lib/test/test_asyncio/test_unix_events.py
Lib/test/test_asyncio/utils.py
Lib/test/test_coroutines.py
Lib/test/test_type_params.py
Lib/test/test_unittest/test_async_case.py

index 9f1aec148f8750b48ec2e2221d6c4dfb4602a4e9..29f843123f85608a814fa5f24aa3b88b6461f935 100644 (file)
@@ -66,6 +66,10 @@ an event loop:
 
    Set *loop* as the current event loop for the current OS thread.
 
+   .. deprecated:: next
+      The :func:`set_event_loop` function is deprecated and will be removed
+      in Python 3.16.
+
 .. function:: new_event_loop()
 
    Create and return a new event loop object.
index 95c636f9e028665523b639d01e9151c0af7cc5f7..662ba649aa08bef774b25e0dbd4c13f7bfbf14f6 100644 (file)
@@ -149,7 +149,7 @@ if __name__ == '__main__':
 
     return_code = 0
     loop = asyncio.new_event_loop()
-    asyncio.set_event_loop(loop)
+    asyncio._set_event_loop(loop)
 
     repl_locals = {'asyncio': asyncio}
     for key in {'__name__', '__package__',
index 3ade7747149b32e0ec27f6fb79cbff15361c4960..6e291d28ec81aea421430b6fb3c2534d8bf10745 100644 (file)
@@ -5,16 +5,22 @@
 # SPDX-FileCopyrightText: Copyright (c) 2015-2021 MagicStack Inc.  http://magic.io
 
 __all__ = (
-    '_AbstractEventLoopPolicy',
-    'AbstractEventLoop', 'AbstractServer',
-    'Handle', 'TimerHandle',
-    '_get_event_loop_policy',
-    'get_event_loop_policy',
-    '_set_event_loop_policy',
-    'set_event_loop_policy',
-    'get_event_loop', 'set_event_loop', 'new_event_loop',
-    '_set_running_loop', 'get_running_loop',
-    '_get_running_loop',
+    "_AbstractEventLoopPolicy",
+    "AbstractEventLoop",
+    "AbstractServer",
+    "Handle",
+    "TimerHandle",
+    "_get_event_loop_policy",
+    "get_event_loop_policy",
+    "_set_event_loop_policy",
+    "set_event_loop_policy",
+    "get_event_loop",
+    "_set_event_loop",
+    "set_event_loop",
+    "new_event_loop",
+    "_set_running_loop",
+    "get_running_loop",
+    "_get_running_loop",
 )
 
 import contextvars
@@ -801,9 +807,13 @@ def get_event_loop():
     return _get_event_loop_policy().get_event_loop()
 
 
+def _set_event_loop(loop):
+    _get_event_loop_policy().set_event_loop(loop)
+
 def set_event_loop(loop):
     """Equivalent to calling get_event_loop_policy().set_event_loop(loop)."""
-    _get_event_loop_policy().set_event_loop(loop)
+    warnings._deprecated('asyncio.set_event_loop', remove=(3,16))
+    _set_event_loop(loop)
 
 
 def new_event_loop():
index 0e63c34f60f4d9e3b124e78f36baae97c48f819a..b9adf291d4817f218481a693782b387dcb11bbb2 100644 (file)
@@ -74,7 +74,7 @@ class Runner:
                 loop.shutdown_default_executor(constants.THREAD_JOIN_TIMEOUT))
         finally:
             if self._set_event_loop:
-                events.set_event_loop(None)
+                events._set_event_loop(None)
             loop.close()
             self._loop = None
             self._state = _State.CLOSED
@@ -147,7 +147,7 @@ class Runner:
             if not self._set_event_loop:
                 # Call set_event_loop only once to avoid calling
                 # attach_loop multiple times on child watchers
-                events.set_event_loop(self._loop)
+                events._set_event_loop(self._loop)
                 self._set_event_loop = True
         else:
             self._loop = self._loop_factory()
index 4bce6d5c1b1d2f2a6359d7baedc18608dc477cf8..5bfd789185c6750b6c302d6ddabc4f621ecaf999 100644 (file)
@@ -624,7 +624,7 @@ class AsyncGenAsyncioTest(unittest.TestCase):
 
     def setUp(self):
         self.loop = asyncio.new_event_loop()
-        asyncio.set_event_loop(None)
+        asyncio._set_event_loop(None)
 
     def tearDown(self):
         self.loop.close()
index d19c7a612ccf868db8f588f1d44332f1aac3a736..2934325b6dfbc759cad5e3f22682ab51b8ad4930 100644 (file)
@@ -24,7 +24,7 @@ class FunctionalTestCaseMixin:
 
     def setUp(self):
         self.loop = self.new_loop()
-        asyncio.set_event_loop(None)
+        asyncio._set_event_loop(None)
 
         self.loop.set_exception_handler(self.loop_exception_handler)
         self.__unhandled_exceptions = []
@@ -39,7 +39,7 @@ class FunctionalTestCaseMixin:
                 self.fail('unexpected calls to loop.call_exception_handler()')
 
         finally:
-            asyncio.set_event_loop(None)
+            asyncio._set_event_loop(None)
             self.loop = None
 
     def tcp_server(self, server_prog, *,
index 08e38b047d519bc5c489e25e93c7f6a534286b4e..1e063c1352ecb980b1d1493129372c2c2f124876 100644 (file)
@@ -331,10 +331,10 @@ class BaseEventLoopTests(test_utils.TestCase):
                 if create_loop:
                     loop2 = base_events.BaseEventLoop()
                     try:
-                        asyncio.set_event_loop(loop2)
+                        asyncio._set_event_loop(loop2)
                         self.check_thread(loop, debug)
                     finally:
-                        asyncio.set_event_loop(None)
+                        asyncio._set_event_loop(None)
                         loop2.close()
                 else:
                     self.check_thread(loop, debug)
@@ -690,7 +690,7 @@ class BaseEventLoopTests(test_utils.TestCase):
 
         loop = Loop()
         self.addCleanup(loop.close)
-        asyncio.set_event_loop(loop)
+        asyncio._set_event_loop(loop)
 
         def run_loop():
             def zero_error():
@@ -1983,7 +1983,7 @@ class BaseEventLoopWithSelectorTests(test_utils.TestCase):
         async def stop_loop_coro(loop):
             loop.stop()
 
-        asyncio.set_event_loop(self.loop)
+        asyncio._set_event_loop(self.loop)
         self.loop.set_debug(True)
         self.loop.slow_callback_duration = 0.0
 
index c626670f72a084c67900ddf808a9fd7ed7882dc4..c8439c9af5e6bafd8e61e100f7d21f7f9985052c 100644 (file)
@@ -58,7 +58,7 @@ def _test_get_event_loop_new_process__sub_proc():
         return 'hello'
 
     loop = asyncio.new_event_loop()
-    asyncio.set_event_loop(loop)
+    asyncio._set_event_loop(loop)
     return loop.run_until_complete(doit())
 
 
@@ -2695,6 +2695,14 @@ class AbstractEventLoopTests(unittest.TestCase):
 
 class PolicyTests(unittest.TestCase):
 
+    def test_asyncio_set_event_loop_deprecation(self):
+        with self.assertWarnsRegex(
+                DeprecationWarning, "'asyncio.set_event_loop' is deprecated"):
+            loop = asyncio.new_event_loop()
+            asyncio.set_event_loop(loop)
+            self.assertIs(loop, asyncio.get_event_loop())
+            loop.close()
+
     def test_abstract_event_loop_policy_deprecation(self):
         with self.assertWarnsRegex(
                 DeprecationWarning, "'asyncio.AbstractEventLoopPolicy' is deprecated"):
@@ -2824,14 +2832,14 @@ class GetEventLoopTestsMixin:
         super().setUp()
 
         self.loop = asyncio.new_event_loop()
-        asyncio.set_event_loop(self.loop)
+        asyncio._set_event_loop(self.loop)
 
     def tearDown(self):
         try:
             super().tearDown()
         finally:
             self.loop.close()
-            asyncio.set_event_loop(None)
+            asyncio._set_event_loop(None)
 
             events._get_running_loop = self._get_running_loop_saved
             events._set_running_loop = self._set_running_loop_saved
@@ -2885,7 +2893,7 @@ class GetEventLoopTestsMixin:
 
             with self.assertRaises(TestError):
                 asyncio.get_event_loop()
-            asyncio.set_event_loop(None)
+            asyncio._set_event_loop(None)
             with self.assertRaises(TestError):
                 asyncio.get_event_loop()
 
@@ -2900,10 +2908,10 @@ class GetEventLoopTestsMixin:
 
             loop.run_until_complete(func())
 
-            asyncio.set_event_loop(loop)
+            asyncio._set_event_loop(loop)
             with self.assertRaises(TestError):
                 asyncio.get_event_loop()
-            asyncio.set_event_loop(None)
+            asyncio._set_event_loop(None)
             with self.assertRaises(TestError):
                 asyncio.get_event_loop()
 
@@ -2927,7 +2935,7 @@ class GetEventLoopTestsMixin:
             with self.assertRaisesRegex(RuntimeError, 'no current'):
                 asyncio.get_event_loop()
 
-            asyncio.set_event_loop(None)
+            asyncio._set_event_loop(None)
             with self.assertRaisesRegex(RuntimeError, 'no current'):
                 asyncio.get_event_loop()
 
@@ -2938,10 +2946,10 @@ class GetEventLoopTestsMixin:
 
             loop.run_until_complete(func())
 
-            asyncio.set_event_loop(loop)
+            asyncio._set_event_loop(loop)
             self.assertIs(asyncio.get_event_loop(), loop)
 
-            asyncio.set_event_loop(None)
+            asyncio._set_event_loop(None)
             with self.assertRaisesRegex(RuntimeError, 'no current'):
                 asyncio.get_event_loop()
 
index 7db70a4c81d4831533fdcca4f2f685a590008c8b..84b44011b9a844a1ca8a528b67995ffab6d5eac2 100644 (file)
@@ -178,8 +178,8 @@ class BaseFutureTests:
 
     def test_constructor_use_global_loop(self):
         # Deprecated in 3.10, undeprecated in 3.12
-        asyncio.set_event_loop(self.loop)
-        self.addCleanup(asyncio.set_event_loop, None)
+        asyncio._set_event_loop(self.loop)
+        self.addCleanup(asyncio._set_event_loop, None)
         f = self._new_future()
         self.assertIs(f._loop, self.loop)
         self.assertIs(f.get_loop(), self.loop)
@@ -566,8 +566,8 @@ class BaseFutureTests:
 
     def test_wrap_future_use_global_loop(self):
         # Deprecated in 3.10, undeprecated in 3.12
-        asyncio.set_event_loop(self.loop)
-        self.addCleanup(asyncio.set_event_loop, None)
+        asyncio._set_event_loop(self.loop)
+        self.addCleanup(asyncio._set_event_loop, None)
         def run(arg):
             return (arg, threading.get_ident())
         ex = concurrent.futures.ThreadPoolExecutor(1)
index c3ba90b309e49fd5fb20a312c65f0225c10cb787..047ada8c5d23df9ad32d5c531c6ef7fc959c77be 100644 (file)
@@ -71,7 +71,7 @@ class StreamTests(test_utils.TestCase):
         try:
             reader, writer = self.loop.run_until_complete(open_connection_fut)
         finally:
-            asyncio.set_event_loop(None)
+            asyncio._set_event_loop(None)
         writer.write(b'GET / HTTP/1.0\r\n\r\n')
         f = reader.read()
         data = self.loop.run_until_complete(f)
@@ -839,8 +839,8 @@ class StreamTests(test_utils.TestCase):
         # asyncio issue #184: Ensure that StreamReaderProtocol constructor
         # retrieves the current loop if the loop parameter is not set
         # Deprecated in 3.10, undeprecated in 3.12
-        self.addCleanup(asyncio.set_event_loop, None)
-        asyncio.set_event_loop(self.loop)
+        self.addCleanup(asyncio._set_event_loop, None)
+        asyncio._set_event_loop(self.loop)
         reader = asyncio.StreamReader()
         self.assertIs(reader._loop, self.loop)
 
@@ -863,8 +863,8 @@ class StreamTests(test_utils.TestCase):
         # asyncio issue #184: Ensure that StreamReaderProtocol constructor
         # retrieves the current loop if the loop parameter is not set
         # Deprecated in 3.10, undeprecated in 3.12
-        self.addCleanup(asyncio.set_event_loop, None)
-        asyncio.set_event_loop(self.loop)
+        self.addCleanup(asyncio._set_event_loop, None)
+        asyncio._set_event_loop(self.loop)
         reader = mock.Mock()
         protocol = asyncio.StreamReaderProtocol(reader)
         self.assertIs(protocol._loop, self.loop)
index 7d6d0564a9a9db0d2f73adbe79aceff203655053..b5363226ad79f403bdadc1f559155a6553f841c4 100644 (file)
@@ -212,8 +212,8 @@ class BaseTaskTests:
         self.assertEqual(t.result(), 'ok')
 
         # Deprecated in 3.10, undeprecated in 3.12
-        asyncio.set_event_loop(self.loop)
-        self.addCleanup(asyncio.set_event_loop, None)
+        asyncio._set_event_loop(self.loop)
+        self.addCleanup(asyncio._set_event_loop, None)
         t = asyncio.ensure_future(notmuch())
         self.assertIs(t._loop, self.loop)
         self.loop.run_until_complete(t)
@@ -2202,8 +2202,8 @@ class BaseTaskTests:
         async def coro():
             return 42
 
-        asyncio.set_event_loop(self.loop)
-        self.addCleanup(asyncio.set_event_loop, None)
+        asyncio._set_event_loop(self.loop)
+        self.addCleanup(asyncio._set_event_loop, None)
         outer = asyncio.shield(coro())
         self.assertEqual(outer._loop, self.loop)
         res = self.loop.run_until_complete(outer)
@@ -2273,7 +2273,7 @@ class BaseTaskTests:
 
         self.assertEqual(self.all_tasks(loop=self.loop), {task})
 
-        asyncio.set_event_loop(None)
+        asyncio._set_event_loop(None)
 
         # execute the task so it waits for future
         self.loop._run_once()
@@ -3278,8 +3278,8 @@ class FutureGatherTests(GatherTestsBase, test_utils.TestCase):
 
     def test_constructor_empty_sequence_use_global_loop(self):
         # Deprecated in 3.10, undeprecated in 3.12
-        asyncio.set_event_loop(self.one_loop)
-        self.addCleanup(asyncio.set_event_loop, None)
+        asyncio._set_event_loop(self.one_loop)
+        self.addCleanup(asyncio._set_event_loop, None)
         fut = asyncio.gather()
         self.assertIsInstance(fut, asyncio.Future)
         self.assertIs(fut._loop, self.one_loop)
@@ -3386,8 +3386,8 @@ class CoroutineGatherTests(GatherTestsBase, test_utils.TestCase):
         # Deprecated in 3.10, undeprecated in 3.12
         async def coro():
             return 'abc'
-        asyncio.set_event_loop(self.other_loop)
-        self.addCleanup(asyncio.set_event_loop, None)
+        asyncio._set_event_loop(self.other_loop)
+        self.addCleanup(asyncio._set_event_loop, None)
         gen1 = coro()
         gen2 = coro()
         fut = asyncio.gather(gen1, gen2)
index e9ee9702248015a82da3deaff07f084d3e683b16..ebb4cc0f7b64fd2c3f8749d3affde27aa2edb87e 100644 (file)
@@ -1116,11 +1116,11 @@ class TestFunctional(unittest.TestCase):
 
     def setUp(self):
         self.loop = asyncio.new_event_loop()
-        asyncio.set_event_loop(self.loop)
+        asyncio._set_event_loop(self.loop)
 
     def tearDown(self):
         self.loop.close()
-        asyncio.set_event_loop(None)
+        asyncio._set_event_loop(None)
 
     def test_add_reader_invalid_argument(self):
         def assert_raises():
index b8dbe7feaac3f48927b46055edf6dfe1a39e4ae9..35ce13896da08ff64abd707574aed0df106f23b2 100644 (file)
@@ -541,7 +541,7 @@ class TestCase(unittest.TestCase):
         if loop is None:
             raise AssertionError('loop is None')
         # ensure that the event loop is passed explicitly in asyncio
-        events.set_event_loop(None)
+        events._set_event_loop(None)
         if cleanup:
             self.addCleanup(self.close_loop, loop)
 
@@ -554,7 +554,7 @@ class TestCase(unittest.TestCase):
         self._thread_cleanup = threading_helper.threading_setup()
 
     def tearDown(self):
-        events.set_event_loop(None)
+        events._set_event_loop(None)
 
         # Detect CPython bug #23353: ensure that yield/yield-from is not used
         # in an except block of a generator
index a72c43f9b47947061b6d5b9938932a93a345d549..840043d5271224955e302d7ba6f07f00748b0d56 100644 (file)
@@ -2287,7 +2287,7 @@ class CoroAsyncIOCompatTest(unittest.TestCase):
             buffer.append('unreachable')
 
         loop = asyncio.new_event_loop()
-        asyncio.set_event_loop(loop)
+        asyncio._set_event_loop(loop)
         try:
             loop.run_until_complete(f())
         except MyException:
index 433b19593bdd04441bd893721cc5c9fb1e95c017..89f836cf722966bfd87369af7c493e76bbb596c2 100644 (file)
@@ -1060,7 +1060,7 @@ class TypeParamsTypeVarTest(unittest.TestCase):
 
         co = get_coroutine()
 
-        self.addCleanup(asyncio.set_event_loop_policy, None)
+        self.addCleanup(asyncio._set_event_loop_policy, None)
         a, b = asyncio.run(co())
 
         self.assertIsInstance(a, TypeVar)
index 993e6bf013cfbf50a5413f2ff40c8bf2d51387e7..fc996b42149dcb1223f5f6d2ad0abc295d4af583 100644 (file)
@@ -476,7 +476,7 @@ class TestAsyncCase(unittest.TestCase):
     def test_setup_get_event_loop(self):
         # See https://github.com/python/cpython/issues/95736
         # Make sure the default event loop is not used
-        asyncio.set_event_loop(None)
+        asyncio._set_event_loop(None)
 
         class TestCase1(unittest.IsolatedAsyncioTestCase):
             def setUp(self):