python: 协程与任务

本文介绍了Python中的协程和任务,包括基本概念、运行协程的三种机制以及可等待对象。重点探讨了asyncio.run、协程函数内的await关键字和任务的并发执行。通过示例代码解释了协程何时开始运行,强调了Task在协程并发中的作用,同时提到了协程与生成器的关系以及异步编程的基本思路。
摘要由CSDN通过智能技术生成

协程与任务

基本概念

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>