运行协程需要一个事件循环。使用asyncio() library 创建一个:
import asyncio
# Python 3.7+
asyncio.run(foo())
或
# Python 3.6 and older
loop = asyncio.get_event_loop()
loop.run_until_complete(foo())
另见Tasks and Coroutines chapter of the asyncio documentation。如果您已经运行了一个循环,您可能希望通过创建一个任务来同时运行其他协程(Python 3.7+ 中为asyncio.create_task(...),旧版本中为asyncio.ensure_future(...))。
但请注意,time.sleep() 不是一个可等待的对象。它返回None,所以你会在 1 秒后得到一个异常:
>>> 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
在这种情况下,您应该改用asyncio.sleep() coroutine:
async def foo():
await asyncio.sleep(1)
它与循环配合以使其他任务能够运行。要阻止来自没有 asyncio 等效项的第三方库的代码,您可以在 executor pool 中运行该代码。请参阅 asyncio 开发指南中的 Running Blocking Code。