Skip to content

Commit

Permalink
GH-95899: fix asyncio.Runner to call set_event_loop only once (GH-95900
Browse files Browse the repository at this point in the history
…) (#96003)

(cherry picked from commit 914f636)

Co-authored-by: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com>
  • Loading branch information
miss-islington and kumaraditya303 committed Aug 15, 2022
1 parent 3fa97b8 commit 8bd7a0b
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 3 deletions.
8 changes: 5 additions & 3 deletions Lib/asyncio/runners.py
Expand Up @@ -115,8 +115,6 @@ 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:
Expand All @@ -137,7 +135,11 @@ def _lazy_init(self):
return
if self._loop_factory is None:
self._loop = events.new_event_loop()
self._set_event_loop = True
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)
self._set_event_loop = True
else:
self._loop = self._loop_factory()
if self._debug is not None:
Expand Down
14 changes: 14 additions & 0 deletions Lib/test/test_asyncio/test_runners.py
Expand Up @@ -456,6 +456,20 @@ async def coro():
):
runner.run(coro())

def test_set_event_loop_called_once(self):
# See https://github.com/python/cpython/issues/95736
async def coro():
pass

policy = asyncio.get_event_loop_policy()
policy.set_event_loop = mock.Mock()
runner = asyncio.Runner()
runner.run(coro())
runner.run(coro())

self.assertEqual(1, policy.set_event_loop.call_count)
runner.close()


if __name__ == '__main__':
unittest.main()
@@ -0,0 +1 @@
Fix :class:`asyncio.Runner` to call :func:`asyncio.set_event_loop` only once to avoid calling :meth:`~asyncio.AbstractChildWatcher.attach_loop` multiple times on child watchers. Patch by Kumar Aditya.

0 comments on commit 8bd7a0b

Please sign in to comment.