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)
It doesn't mentioned in doc, but currently asyncio.sleep(0)
is common way to do this. You can read full discussion here. Moreover asyncio.sleep(0)
was specially optimized to do job. Since this case has test, I think you might not afraid about behavior.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With