协程与任务
基本概念
coroutine – 协程
协程是子例程的更一般形式。 子例程可以在某一点进入并在另一点退出。 协程则可以在许多不同的点上进入、退出和恢复。 它们可通过 async def 语句来实现。 参见 PEP 492。
coroutine function – 协程函数
返回一个 coroutine 对象的函数。协程函数可通过 async def 语句来定义,并可能包含 await、async for 和 async with 关键字。这些特性是由 PEP 492 引入的。
async def mycoro():
...
(function) mycoro: () -> Coroutine[Any, Any, None]
async 语法糖会强制wrap后面的函数,让其成为Coroutine
对象
运行协程的三种机制
asyncio.run运行一个协程
asyncio.run()
asyncio.run()
函数用来运行最高层级的入口点函数。
asyncio.run*()
只能运行一个协程,因此一般是用来运行最高层级的入口协程。
注意: asyncio.run()
默认会在主线程创建一个Event Loop
并run_untill_complete
,所以是阻塞的。
在协程函数里通过await关键字调用
import time
async def say_after(delay, what):
await asyncio.sleep(delay)
print(what)
async def main():
print(f"started at {time.strftime('%X')}")
await say_after(1, 'hello') # <<< 这样就直接运行了say_after这个协程,耗时1s
await say_after(2, 'world') # <<< 耗时2s
print(f"finished at {time.strftime('%X')}")
asyncio.run(main())
started at 17:24:35
hello
world
finished at 17:24:38
耗时:3, 泥马,压根没异步没并发。