I'm running a long CPU-intensive task on a (tornado) webserver. I don't want to offload this task to a thread (for now). How do I correctly "yield" control during this long-running task to the eventloop, so that web requests are still being served (note: I'm using "yield" in a cooperative-scheduling sense here, not in a generator-sense, or the python keyword yield
).
My suggestion would be to do an await asyncio.sleep(0)
, however is there a guarantee that this is not just implemented as a NOP? I've been looking for a dedicated function in asyncio library to do this, but so far have been unable to find one.
Example (python 3.5 async/await style):
async def long_task():
for i in range(LARGE_NUMBER):
do_something(i)
if i % 100 == 0:
await asyncio.sleep(0)