How to use async/await in Python 3.5?
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import time async def foo(): await time.sleep(1) foo()
I couldn't make this dead simple example to run:
RuntimeWarning: coroutine 'foo' was never awaited foo()
Running coroutines requires an event loop. Use the
asyncio() library to create one:
import asyncio # Python 3.7+ asyncio.run(foo())
# Python 3.6 and older loop = asyncio.get_event_loop() loop.run_until_complete(foo())
Also see the Tasks and Coroutines chapter of the
asyncio documentation. If you already have a loop running, you'd want to run additional coroutines concurrently by creating a task (
asyncio.create_task(...) in Python 3.7+,
asyncio.ensure_future(...) in older versions).
Note however that
time.sleep() is not an awaitable object. It returns
None so you get an exception after 1 second:
>>> asyncio.run(foo()) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/.../lib/python3.7/asyncio/runners.py", line 43, in run return loop.run_until_complete(main) File "/.../lib/python3.7/asyncio/base_events.py", line 573, in run_until_complete return future.result() File "<stdin>", line 2, in foo TypeError: object NoneType can't be used in 'await' expression
In this case you should use the
asyncio.sleep() coroutine instead:
async def foo(): await asyncio.sleep(1)
which is cooperates with the loop to enable other tasks to run. For blocking code from third-party libraries that do not have asyncio equivalents, you could run that code in an executor pool. See Running Blocking Code in the asyncio development guide.