@@ -393,6 +393,131 @@ async def gen():
393393 r'anext\(\): asynchronous generator is already running' ):
394394 an .__next__ ()
395395
396+ def test_async_gen_asend_throw_concurrent_with_send (self ):
397+ import types
398+
399+ @types .coroutine
400+ def _async_yield (v ):
401+ return (yield v )
402+
403+ class MyExc (Exception ):
404+ pass
405+
406+ async def agenfn ():
407+ while True :
408+ try :
409+ await _async_yield (None )
410+ except MyExc :
411+ pass
412+ return
413+ yield
414+
415+
416+ agen = agenfn ()
417+ gen = agen .asend (None )
418+ gen .send (None )
419+ gen2 = agen .asend (None )
420+
421+ with self .assertRaisesRegex (RuntimeError ,
422+ r'anext\(\): asynchronous generator is already running' ):
423+ gen2 .throw (MyExc )
424+
425+ def test_async_gen_athrow_throw_concurrent_with_send (self ):
426+ import types
427+
428+ @types .coroutine
429+ def _async_yield (v ):
430+ return (yield v )
431+
432+ class MyExc (Exception ):
433+ pass
434+
435+ async def agenfn ():
436+ while True :
437+ try :
438+ await _async_yield (None )
439+ except MyExc :
440+ pass
441+ return
442+ yield
443+
444+
445+ agen = agenfn ()
446+ gen = agen .asend (None )
447+ gen .send (None )
448+ gen2 = agen .athrow (MyExc )
449+
450+ with self .assertRaisesRegex (RuntimeError ,
451+ r'athrow\(\): asynchronous generator is already running' ):
452+ gen2 .throw (MyExc )
453+
454+ def test_async_gen_asend_throw_concurrent_with_throw (self ):
455+ import types
456+
457+ @types .coroutine
458+ def _async_yield (v ):
459+ return (yield v )
460+
461+ class MyExc (Exception ):
462+ pass
463+
464+ async def agenfn ():
465+ try :
466+ yield
467+ except MyExc :
468+ pass
469+ while True :
470+ try :
471+ await _async_yield (None )
472+ except MyExc :
473+ pass
474+
475+
476+ agen = agenfn ()
477+ with self .assertRaises (StopIteration ):
478+ agen .asend (None ).send (None )
479+
480+ gen = agen .athrow (MyExc )
481+ gen .throw (MyExc )
482+ gen2 = agen .asend (MyExc )
483+
484+ with self .assertRaisesRegex (RuntimeError ,
485+ r'anext\(\): asynchronous generator is already running' ):
486+ gen2 .throw (MyExc )
487+
488+ def test_async_gen_athrow_throw_concurrent_with_throw (self ):
489+ import types
490+
491+ @types .coroutine
492+ def _async_yield (v ):
493+ return (yield v )
494+
495+ class MyExc (Exception ):
496+ pass
497+
498+ async def agenfn ():
499+ try :
500+ yield
501+ except MyExc :
502+ pass
503+ while True :
504+ try :
505+ await _async_yield (None )
506+ except MyExc :
507+ pass
508+
509+ agen = agenfn ()
510+ with self .assertRaises (StopIteration ):
511+ agen .asend (None ).send (None )
512+
513+ gen = agen .athrow (MyExc )
514+ gen .throw (MyExc )
515+ gen2 = agen .athrow (None )
516+
517+ with self .assertRaisesRegex (RuntimeError ,
518+ r'athrow\(\): asynchronous generator is already running' ):
519+ gen2 .throw (MyExc )
520+
396521 def test_async_gen_3_arg_deprecation_warning (self ):
397522 async def gen ():
398523 yield 123
@@ -1569,6 +1694,8 @@ async def main():
15691694 self .assertIsInstance (message ['exception' ], ZeroDivisionError )
15701695 self .assertIn ('unhandled exception during asyncio.run() shutdown' ,
15711696 message ['message' ])
1697+ del message , messages
1698+ gc_collect ()
15721699
15731700 def test_async_gen_expression_01 (self ):
15741701 async def arange (n ):
@@ -1622,6 +1749,7 @@ async def main():
16221749 asyncio .run (main ())
16231750
16241751 self .assertEqual ([], messages )
1752+ gc_collect ()
16251753
16261754 def test_async_gen_await_same_anext_coro_twice (self ):
16271755 async def async_iterate ():
0 commit comments