New submission from Davy Durham <davydur...@gmail.com>:
I was searching for a way to "yield" from task/coroutinue back to the event loop (not yielding a value in terms of a generator) and not finding anything documented, I found this bug report and PR: https://github.com/python/asyncio/issues/284 It states that asyncio.sleep(0) should cause the coroutine to send control back to the event loop without wastefully doing other work. That makes sense and a perfectly good way to do that. And, the code appears to handle a value of <= 0 specifically: https://github.com/python/cpython/blob/3.8/Lib/asyncio/tasks.py#L632 However, using sleep(0) to yield back does not cause it to raise a CancelledError if the task has been cancelled as cancel()'s documentation indicates it should. But sleeping for anything >0 does (e.g. 0.001) The below code snippet will demonstrate the problem: TIA ---- import asyncio import time async def cancel_me(): print('cancel_me(): before sleep') try: while True: print("doing some really intensive cpu stuff") time.sleep(2) # now I want to yield control back to the event loop in order to determine if we've been cancelled await asyncio.sleep(0) # I'm expecting this to throw CancelledError, but it never does.. it DOES throw if the delay > 0 (e.g. 0.001) except asyncio.CancelledError: print('cancel_me(): cancelled!') raise async def main(): task = asyncio.create_task(cancel_me()) await asyncio.sleep(1) task.cancel() try: await task except asyncio.CancelledError: print("main(): cancel_me is cancelled now") asyncio.run(main()) ---------- components: asyncio messages: 370164 nosy: Davy Durham, asvetlov, yselivanov priority: normal severity: normal status: open title: asyncio.sleep(0) should "yield" back to the event loop, but it doesn't behave as expected type: behavior versions: Python 3.7 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue40800> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com