python: 协程与任务

协程与任务

基本概念

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 Looprun_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, 泥马,压根没异步没并发。

你可能感兴趣的:(Python,python,生成器)