From 05d27a84f4a85d777239e95e6d9b6dae8b32c538 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Sat, 12 Apr 2025 12:03:52 +0530 Subject: gh-130322: drop deprecation of `asyncio.set_event_loop` (#132349) --- Doc/deprecations/pending-removal-in-3.16.rst | 1 - Doc/library/asyncio-eventloop.rst | 10 +++------- Lib/asyncio/__main__.py | 2 +- Lib/asyncio/events.py | 7 +------ Lib/asyncio/runners.py | 4 ++-- Lib/test/test_asyncgen.py | 2 +- Lib/test/test_asyncio/functional.py | 4 ++-- Lib/test/test_asyncio/test_base_events.py | 8 ++++---- Lib/test/test_asyncio/test_events.py | 26 +++++++++----------------- Lib/test/test_asyncio/test_futures.py | 8 ++++---- Lib/test/test_asyncio/test_streams.py | 10 +++++----- Lib/test/test_asyncio/test_tasks.py | 16 ++++++++-------- Lib/test/test_asyncio/test_unix_events.py | 4 ++-- Lib/test/test_asyncio/utils.py | 4 ++-- Lib/test/test_coroutines.py | 2 +- Lib/test/test_unittest/test_async_case.py | 2 +- 16 files changed, 46 insertions(+), 64 deletions(-) diff --git a/Doc/deprecations/pending-removal-in-3.16.rst b/Doc/deprecations/pending-removal-in-3.16.rst index b408a6d..acb5319 100644 --- a/Doc/deprecations/pending-removal-in-3.16.rst +++ b/Doc/deprecations/pending-removal-in-3.16.rst @@ -32,7 +32,6 @@ Pending removal in Python 3.16 * :class:`asyncio.WindowsProactorEventLoopPolicy` * :func:`asyncio.get_event_loop_policy` * :func:`asyncio.set_event_loop_policy` - * :func:`asyncio.set_event_loop` Users should use :func:`asyncio.run` or :class:`asyncio.Runner` with *loop_factory* to use the desired event loop implementation. diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index fdb75fe..fae6880 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -65,18 +65,14 @@ an event loop: .. note:: The :mod:`!asyncio` policy system is deprecated and will be removed - in Python 3.16; from there on, this function will always return the - running event loop. - + in Python 3.16; from there on, this function will return the current + running event loop if present else it will return the + loop set by :func:`set_event_loop`. .. function:: set_event_loop(loop) Set *loop* as the current event loop for the current OS thread. - .. deprecated:: 3.14 - 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. diff --git a/Lib/asyncio/__main__.py b/Lib/asyncio/__main__.py index e624f76..69f5a30 100644 --- a/Lib/asyncio/__main__.py +++ b/Lib/asyncio/__main__.py @@ -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__', diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py index 2e45b4f..2913f90 100644 --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -15,7 +15,6 @@ __all__ = ( "_set_event_loop_policy", "set_event_loop_policy", "get_event_loop", - "_set_event_loop", "set_event_loop", "new_event_loop", "_set_running_loop", @@ -835,13 +834,9 @@ 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).""" - warnings._deprecated('asyncio.set_event_loop', remove=(3,16)) - _set_event_loop(loop) + _get_event_loop_policy().set_event_loop(loop) def new_event_loop(): diff --git a/Lib/asyncio/runners.py b/Lib/asyncio/runners.py index 14397b4..ba37e00 100644 --- a/Lib/asyncio/runners.py +++ b/Lib/asyncio/runners.py @@ -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() diff --git a/Lib/test/test_asyncgen.py b/Lib/test/test_asyncgen.py index d7dcf61..2c44647 100644 --- a/Lib/test/test_asyncgen.py +++ b/Lib/test/test_asyncgen.py @@ -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() diff --git a/Lib/test/test_asyncio/functional.py b/Lib/test/test_asyncio/functional.py index 555394b..96dc9ab 100644 --- a/Lib/test/test_asyncio/functional.py +++ b/Lib/test/test_asyncio/functional.py @@ -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, *, diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index 7838d1f..2ca5c4c 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -336,10 +336,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) @@ -695,7 +695,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(): @@ -1988,7 +1988,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 diff --git a/Lib/test/test_asyncio/test_events.py b/Lib/test/test_asyncio/test_events.py index a067bc9..873c503 100644 --- a/Lib/test/test_asyncio/test_events.py +++ b/Lib/test/test_asyncio/test_events.py @@ -57,7 +57,7 @@ def _test_get_event_loop_new_process__sub_proc(): return 'hello' with contextlib.closing(asyncio.new_event_loop()) as loop: - asyncio._set_event_loop(loop) + asyncio.set_event_loop(loop) return loop.run_until_complete(doit()) @@ -2830,14 +2830,6 @@ 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"): @@ -2974,14 +2966,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 @@ -3053,7 +3045,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() @@ -3068,10 +3060,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() @@ -3095,7 +3087,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() @@ -3106,10 +3098,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() diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py index 01d6230..8b51522 100644 --- a/Lib/test/test_asyncio/test_futures.py +++ b/Lib/test/test_asyncio/test_futures.py @@ -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) diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index 0b47b2b..4fa4384 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -68,7 +68,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) @@ -836,8 +836,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) @@ -860,8 +860,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) diff --git a/Lib/test/test_asyncio/test_tasks.py b/Lib/test/test_asyncio/test_tasks.py index f1a665e..8d7f173 100644 --- a/Lib/test/test_asyncio/test_tasks.py +++ b/Lib/test/test_asyncio/test_tasks.py @@ -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) @@ -3322,8 +3322,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) @@ -3430,8 +3430,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) diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py index 7f9f5a1..e020c1f 100644 --- a/Lib/test/test_asyncio/test_unix_events.py +++ b/Lib/test/test_asyncio/test_unix_events.py @@ -1113,11 +1113,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(): diff --git a/Lib/test/test_asyncio/utils.py b/Lib/test/test_asyncio/utils.py index c611057..ad2bde4 100644 --- a/Lib/test/test_asyncio/utils.py +++ b/Lib/test/test_asyncio/utils.py @@ -540,7 +540,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) @@ -553,7 +553,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 diff --git a/Lib/test/test_coroutines.py b/Lib/test/test_coroutines.py index deeaa72..761cb23 100644 --- a/Lib/test/test_coroutines.py +++ b/Lib/test/test_coroutines.py @@ -2300,7 +2300,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: diff --git a/Lib/test/test_unittest/test_async_case.py b/Lib/test/test_unittest/test_async_case.py index fc996b4..993e6bf 100644 --- a/Lib/test/test_unittest/test_async_case.py +++ b/Lib/test/test_unittest/test_async_case.py @@ -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): -- cgit v0.12