Browse Source

Add asyncio.get_running_loop() function. (#4782)

pull/4788/merge
Yury Selivanov 9 years ago
committed by GitHub
parent
commit
abae67ebc2
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 7
      Doc/library/asyncio-eventloops.rst
  2. 14
      Lib/asyncio/events.py
  3. 6
      Lib/test/test_asyncio/test_events.py
  4. 1
      Misc/NEWS.d/next/Library/2017-12-10-12-30-13.bpo-32269.Q85pKj.rst

7
Doc/library/asyncio-eventloops.rst

@ -25,6 +25,13 @@ the execution of the process.
Equivalent to calling ``get_event_loop_policy().new_event_loop()``.
.. function:: get_running_loop()
Return the running event loop in the current OS thread. If there
is no running event loop a :exc:`RuntimeError` is raised.
.. versionadded:: 3.7
.. _asyncio-event-loops:

14
Lib/asyncio/events.py

@ -7,7 +7,8 @@ __all__ = (
'get_event_loop_policy', 'set_event_loop_policy',
'get_event_loop', 'set_event_loop', 'new_event_loop',
'get_child_watcher', 'set_child_watcher',
'_set_running_loop', '_get_running_loop',
'_set_running_loop', 'get_running_loop',
'_get_running_loop',
)
import functools
@ -646,6 +647,17 @@ class _RunningLoop(threading.local):
_running_loop = _RunningLoop()
def get_running_loop():
"""Return the running event loop. Raise a RuntimeError if there is none.
This function is thread-specific.
"""
loop = _get_running_loop()
if loop is None:
raise RuntimeError('no running event loop')
return loop
def _get_running_loop():
"""Return the running event loop or None.

6
Lib/test/test_asyncio/test_events.py

@ -2733,10 +2733,13 @@ class PolicyTests(unittest.TestCase):
try:
asyncio.set_event_loop_policy(Policy())
loop = asyncio.new_event_loop()
with self.assertRaisesRegex(RuntimeError, 'no running'):
self.assertIs(asyncio.get_running_loop(), None)
self.assertIs(asyncio._get_running_loop(), None)
async def func():
self.assertIs(asyncio.get_event_loop(), loop)
self.assertIs(asyncio.get_running_loop(), loop)
self.assertIs(asyncio._get_running_loop(), loop)
loop.run_until_complete(func())
@ -2745,6 +2748,9 @@ class PolicyTests(unittest.TestCase):
if loop is not None:
loop.close()
with self.assertRaisesRegex(RuntimeError, 'no running'):
self.assertIs(asyncio.get_running_loop(), None)
self.assertIs(asyncio._get_running_loop(), None)

1
Misc/NEWS.d/next/Library/2017-12-10-12-30-13.bpo-32269.Q85pKj.rst

@ -0,0 +1 @@
Add asyncio.get_running_loop() function.
Loading…
Cancel
Save