Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-127949: deprecate asyncio.get_event_loop_policy #128053

Merged
merged 3 commits into from
Dec 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions Doc/library/asyncio-policy.rst
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ for the current process:

Return the current process-wide policy.

.. deprecated:: next
The :func:`get_event_loop_policy` function is deprecated and
will be removed in Python 3.16.
kumaraditya303 marked this conversation as resolved.
Show resolved Hide resolved

.. function:: set_event_loop_policy(policy)

Set the current process-wide policy to *policy*.
Expand Down
14 changes: 9 additions & 5 deletions Lib/asyncio/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
'AbstractEventLoopPolicy',
'AbstractEventLoop', 'AbstractServer',
'Handle', 'TimerHandle',
'_get_event_loop_policy',
'get_event_loop_policy',
'_set_event_loop_policy',
'set_event_loop_policy',
Expand Down Expand Up @@ -761,12 +762,15 @@ def _init_event_loop_policy():
_event_loop_policy = DefaultEventLoopPolicy()


def get_event_loop_policy():
def _get_event_loop_policy():
"""Get the current event loop policy."""
if _event_loop_policy is None:
_init_event_loop_policy()
return _event_loop_policy

def get_event_loop_policy():
warnings._deprecated('asyncio.get_event_loop_policy', remove=(3, 16))
return _get_event_loop_policy()

def _set_event_loop_policy(policy):
"""Set the current event loop policy.
Expand All @@ -778,7 +782,7 @@ def _set_event_loop_policy(policy):
_event_loop_policy = policy

def set_event_loop_policy(policy):
warnings._deprecated('set_event_loop_policy', remove=(3,16))
warnings._deprecated('asyncio.set_event_loop_policy', remove=(3,16))
_set_event_loop_policy(policy)

def get_event_loop():
Expand All @@ -794,17 +798,17 @@ def get_event_loop():
current_loop = _get_running_loop()
if current_loop is not None:
return current_loop
return get_event_loop_policy().get_event_loop()
return _get_event_loop_policy().get_event_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)
_get_event_loop_policy().set_event_loop(loop)


def new_event_loop():
"""Equivalent to calling get_event_loop_policy().new_event_loop()."""
return get_event_loop_policy().new_event_loop()
return _get_event_loop_policy().new_event_loop()


# Alias pure-Python implementations for testing purposes.
Expand Down
29 changes: 18 additions & 11 deletions Lib/test/test_asyncio/test_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -2397,7 +2397,7 @@ def test_handle_repr_debug(self):
self.assertRegex(repr(h), regex)

def test_handle_source_traceback(self):
loop = asyncio.get_event_loop_policy().new_event_loop()
loop = asyncio.new_event_loop()
loop.set_debug(True)
self.set_event_loop(loop)

Expand Down Expand Up @@ -2759,24 +2759,31 @@ def test_set_event_loop(self):
old_loop.close()

def test_get_event_loop_policy(self):
policy = asyncio.get_event_loop_policy()
self.assertIsInstance(policy, asyncio.AbstractEventLoopPolicy)
self.assertIs(policy, asyncio.get_event_loop_policy())
with self.assertWarnsRegex(
DeprecationWarning, "'asyncio.get_event_loop_policy' is deprecated"):
policy = asyncio.get_event_loop_policy()
self.assertIsInstance(policy, asyncio.AbstractEventLoopPolicy)
self.assertIs(policy, asyncio.get_event_loop_policy())

def test_set_event_loop_policy(self):
with self.assertWarnsRegex(
DeprecationWarning, "'set_event_loop_policy' is deprecated"):
DeprecationWarning, "'asyncio.set_event_loop_policy' is deprecated"):
self.assertRaises(
TypeError, asyncio.set_event_loop_policy, object())

old_policy = asyncio.get_event_loop_policy()
with self.assertWarnsRegex(
DeprecationWarning, "'asyncio.get_event_loop_policy' is deprecated"):
old_policy = asyncio.get_event_loop_policy()

policy = asyncio.DefaultEventLoopPolicy()
with self.assertWarnsRegex(
DeprecationWarning, "'set_event_loop_policy' is deprecated"):
DeprecationWarning, "'asyncio.set_event_loop_policy' is deprecated"):
asyncio.set_event_loop_policy(policy)
self.assertIs(policy, asyncio.get_event_loop_policy())
self.assertIsNot(policy, old_policy)

with self.assertWarnsRegex(
DeprecationWarning, "'asyncio.get_event_loop_policy' is deprecated"):
self.assertIs(policy, asyncio.get_event_loop_policy())
self.assertIsNot(policy, old_policy)


class GetEventLoopTestsMixin:
Expand Down Expand Up @@ -2859,7 +2866,7 @@ class Policy(asyncio.DefaultEventLoopPolicy):
def get_event_loop(self):
raise TestError

old_policy = asyncio.get_event_loop_policy()
old_policy = asyncio._get_event_loop_policy()
try:
asyncio._set_event_loop_policy(Policy())
loop = asyncio.new_event_loop()
Expand Down Expand Up @@ -2899,7 +2906,7 @@ async def func():
self.assertIs(asyncio._get_running_loop(), None)

def test_get_event_loop_returns_running_loop2(self):
old_policy = asyncio.get_event_loop_policy()
old_policy = asyncio._get_event_loop_policy()
try:
asyncio._set_event_loop_policy(asyncio.DefaultEventLoopPolicy())
loop = asyncio.new_event_loop()
Expand Down
6 changes: 3 additions & 3 deletions Lib/test/test_asyncio/test_runners.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ def setUp(self):
asyncio._set_event_loop_policy(policy)

def tearDown(self):
policy = asyncio.get_event_loop_policy()
policy = asyncio._get_event_loop_policy()
if policy.loop is not None:
self.assertTrue(policy.loop.is_closed())
self.assertTrue(policy.loop.shutdown_ag_run)
Expand Down Expand Up @@ -208,7 +208,7 @@ async def main():
await asyncio.sleep(0)
return 42

policy = asyncio.get_event_loop_policy()
policy = asyncio._get_event_loop_policy()
policy.set_event_loop = mock.Mock()
asyncio.run(main())
self.assertTrue(policy.set_event_loop.called)
Expand Down Expand Up @@ -495,7 +495,7 @@ def test_set_event_loop_called_once(self):
async def coro():
pass

policy = asyncio.get_event_loop_policy()
policy = asyncio._get_event_loop_policy()
policy.set_event_loop = mock.Mock()
runner = asyncio.Runner()
runner.run(coro())
Expand Down
3 changes: 1 addition & 2 deletions Lib/test/test_asyncio/test_subprocess.py
Original file line number Diff line number Diff line change
Expand Up @@ -886,8 +886,7 @@ class SubprocessWatcherMixin(SubprocessMixin):

def setUp(self):
super().setUp()
policy = asyncio.get_event_loop_policy()
self.loop = policy.new_event_loop()
self.loop = asyncio.new_event_loop()
self.set_event_loop(self.loop)

def test_watcher_implementation(self):
Expand Down
4 changes: 2 additions & 2 deletions Lib/test/test_asyncio/test_windows_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -332,7 +332,7 @@ async def main():
asyncio.get_running_loop(),
asyncio.SelectorEventLoop)

old_policy = asyncio.get_event_loop_policy()
old_policy = asyncio._get_event_loop_policy()
try:
asyncio._set_event_loop_policy(
asyncio.WindowsSelectorEventLoopPolicy())
Expand All @@ -346,7 +346,7 @@ async def main():
asyncio.get_running_loop(),
asyncio.ProactorEventLoop)

old_policy = asyncio.get_event_loop_policy()
old_policy = asyncio._get_event_loop_policy()
try:
asyncio._set_event_loop_policy(
asyncio.WindowsProactorEventLoopPolicy())
Expand Down
2 changes: 1 addition & 1 deletion Lib/test/test_contextlib_async.py
Original file line number Diff line number Diff line change
Expand Up @@ -496,7 +496,7 @@ class TestAsyncExitStack(TestBaseExitStack, unittest.IsolatedAsyncioTestCase):
class SyncAsyncExitStack(AsyncExitStack):
@staticmethod
def run_coroutine(coro):
loop = asyncio.get_event_loop_policy().get_event_loop()
loop = asyncio.new_event_loop()
t = loop.create_task(coro)
t.add_done_callback(lambda f: loop.stop())
loop.run_forever()
Expand Down
2 changes: 1 addition & 1 deletion Lib/test/test_unittest/test_async_case.py
Original file line number Diff line number Diff line change
Expand Up @@ -480,7 +480,7 @@ def test_setup_get_event_loop(self):

class TestCase1(unittest.IsolatedAsyncioTestCase):
def setUp(self):
asyncio.get_event_loop_policy().get_event_loop()
asyncio._get_event_loop_policy().get_event_loop()

async def test_demo1(self):
pass
Expand Down
2 changes: 1 addition & 1 deletion Modules/_asynciomodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -3773,7 +3773,7 @@ module_init(asyncio_state *state)
}

WITH_MOD("asyncio.events")
GET_MOD_ATTR(state->asyncio_get_event_loop_policy, "get_event_loop_policy")
GET_MOD_ATTR(state->asyncio_get_event_loop_policy, "_get_event_loop_policy")

WITH_MOD("asyncio.base_futures")
GET_MOD_ATTR(state->asyncio_future_repr_func, "_future_repr")
Expand Down
Loading