Skip to content

Commit

Permalink
GH-93896: AAlways set event loop in asyncio.run and IsolatedAsyncioTe…
Browse files Browse the repository at this point in the history
…stCase (GH-94593)

(cherry picked from commit 14fea6b)

Co-authored-by: Kumar Aditya <[email protected]>
  • Loading branch information
miss-islington and kumaraditya303 authored Jul 6, 2022
1 parent b22f9d6 commit 0187b60
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 0 deletions.
6 changes: 6 additions & 0 deletions Lib/asyncio/runners.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ def __init__(self, *, debug=None, loop_factory=None):
self._loop = None
self._context = None
self._interrupt_count = 0
self._set_event_loop = False

def __enter__(self):
self._lazy_init()
Expand All @@ -71,6 +72,8 @@ def close(self):
loop.run_until_complete(loop.shutdown_asyncgens())
loop.run_until_complete(loop.shutdown_default_executor())
finally:
if self._set_event_loop:
events.set_event_loop(None)
loop.close()
self._loop = None
self._state = _State.CLOSED
Expand Down Expand Up @@ -112,6 +115,8 @@ def run(self, coro, *, context=None):

self._interrupt_count = 0
try:
if self._set_event_loop:
events.set_event_loop(self._loop)
return self._loop.run_until_complete(task)
except exceptions.CancelledError:
if self._interrupt_count > 0 and task.uncancel() == 0:
Expand All @@ -131,6 +136,7 @@ def _lazy_init(self):
return
if self._loop_factory is None:
self._loop = events.new_event_loop()
self._set_event_loop = True
else:
self._loop = self._loop_factory()
if self._debug is not None:
Expand Down
12 changes: 12 additions & 0 deletions Lib/test/test_asyncio/test_runners.py
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,18 @@ async def main():
self.assertIsNone(spinner.ag_frame)
self.assertFalse(spinner.ag_running)

def test_asyncio_run_set_event_loop(self):
#See https://github.com/python/cpython/issues/93896

async def main():
await asyncio.sleep(0)
return 42

policy = asyncio.get_event_loop_policy()
policy.set_event_loop = mock.Mock()
asyncio.run(main())
self.assertTrue(policy.set_event_loop.called)


class RunnerTests(BaseTest):

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix :func:`asyncio.run` and :class:`unittest.IsolatedAsyncioTestCase` to always the set event loop as it was done in Python 3.10 and earlier. Patch by Kumar Aditya.

0 comments on commit 0187b60

Please sign in to comment.