This repository was archived by the owner on Nov 23, 2017. It is now read-only.
File tree Expand file tree Collapse file tree 3 files changed +24
-4
lines changed Expand file tree Collapse file tree 3 files changed +24
-4
lines changed Original file line number Diff line number Diff line change @@ -394,13 +394,15 @@ def run_forever(self):
394
394
self ._check_closed ()
395
395
if self .is_running ():
396
396
raise RuntimeError ('Event loop is running.' )
397
+ if events ._get_running_loop () is not None :
398
+ raise RuntimeError (
399
+ 'Cannot run the event loop while another loop is running' )
397
400
self ._set_coroutine_wrapper (self ._debug )
398
401
self ._thread_id = threading .get_ident ()
399
402
if self ._asyncgens is not None :
400
403
old_agen_hooks = sys .get_asyncgen_hooks ()
401
404
sys .set_asyncgen_hooks (firstiter = self ._asyncgen_firstiter_hook ,
402
405
finalizer = self ._asyncgen_finalizer_hook )
403
- old_loop = events ._get_running_loop ()
404
406
try :
405
407
events ._set_running_loop (self )
406
408
while True :
@@ -410,7 +412,7 @@ def run_forever(self):
410
412
finally :
411
413
self ._stopping = False
412
414
self ._thread_id = None
413
- events ._set_running_loop (old_loop )
415
+ events ._set_running_loop (None )
414
416
self ._set_coroutine_wrapper (False )
415
417
if self ._asyncgens is not None :
416
418
sys .set_asyncgen_hooks (* old_agen_hooks )
Original file line number Diff line number Diff line change @@ -658,8 +658,8 @@ def set_event_loop_policy(policy):
658
658
def get_event_loop ():
659
659
"""Return an asyncio event loop.
660
660
661
- When called from coroutines, this function will always return the
662
- running event loop.
661
+ When called from a coroutine or a callback (e.g. scheduled with call_soon
662
+ or similar API), this function will always return the running event loop.
663
663
664
664
If there is no running event loop set, the function will return
665
665
the result of `get_event_loop_policy().get_event_loop()` call.
Original file line number Diff line number Diff line change @@ -1694,5 +1694,23 @@ def stop_loop_coro(loop):
1694
1694
"took .* seconds$" )
1695
1695
1696
1696
1697
+ class RunningLoopTests (unittest .TestCase ):
1698
+
1699
+ def test_running_loop_within_a_loop (self ):
1700
+ @asyncio .coroutine
1701
+ def runner (loop ):
1702
+ loop .run_forever ()
1703
+
1704
+ loop = asyncio .new_event_loop ()
1705
+ outer_loop = asyncio .new_event_loop ()
1706
+ try :
1707
+ with self .assertRaisesRegex (RuntimeError ,
1708
+ 'while another loop is running' ):
1709
+ outer_loop .run_until_complete (runner (loop ))
1710
+ finally :
1711
+ loop .close ()
1712
+ outer_loop .close ()
1713
+
1714
+
1697
1715
if __name__ == '__main__' :
1698
1716
unittest .main ()
You can’t perform that action at this time.
0 commit comments