8

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)
Claude
  • 8,806
  • 4
  • 41
  • 56

1 Answers1

8

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.

Mikhail Gerasimov
  • 36,989
  • 16
  • 116
  • 159
  • Perfect! Linked to the exact discussion I was looking for. As long as the BDFL says that this is the way to do it, I'm happy with it :). – Claude Apr 15 '16 at 13:14