Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cooperative yield in asyncio

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)
like image 264
Claude Avatar asked Apr 15 '16 12:04

Claude


1 Answers

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.

like image 92
Mikhail Gerasimov Avatar answered Sep 30 '22 09:09

Mikhail Gerasimov