mirror of
https://github.com/python/cpython.git
synced 2025-09-19 15:10:58 +00:00
GH-95899: fix asyncio.Runner to call set_event_loop only once (GH-95900) (#96003)
(cherry picked from commit 914f6367a0
)
Co-authored-by: Kumar Aditya <59607654+kumaraditya303@users.noreply.github.com>
This commit is contained in:
parent
3fa97b8589
commit
8bd7a0b581
3 changed files with 20 additions and 3 deletions
|
@ -115,8 +115,6 @@ class Runner:
|
||||||
|
|
||||||
self._interrupt_count = 0
|
self._interrupt_count = 0
|
||||||
try:
|
try:
|
||||||
if self._set_event_loop:
|
|
||||||
events.set_event_loop(self._loop)
|
|
||||||
return self._loop.run_until_complete(task)
|
return self._loop.run_until_complete(task)
|
||||||
except exceptions.CancelledError:
|
except exceptions.CancelledError:
|
||||||
if self._interrupt_count > 0:
|
if self._interrupt_count > 0:
|
||||||
|
@ -137,6 +135,10 @@ class Runner:
|
||||||
return
|
return
|
||||||
if self._loop_factory is None:
|
if self._loop_factory is None:
|
||||||
self._loop = events.new_event_loop()
|
self._loop = events.new_event_loop()
|
||||||
|
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
|
self._set_event_loop = True
|
||||||
else:
|
else:
|
||||||
self._loop = self._loop_factory()
|
self._loop = self._loop_factory()
|
||||||
|
|
|
@ -456,6 +456,20 @@ class RunnerTests(BaseTest):
|
||||||
):
|
):
|
||||||
runner.run(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__':
|
if __name__ == '__main__':
|
||||||
unittest.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.
|
Loading…
Add table
Add a link
Reference in a new issue