python中协程异步IO(asyncio)详解(一)

文章详细介绍了Python中的协程概念,包括如何使用yield和send进行协程控制,以及协程的预激活和返回值。接着,文章探讨了yieldfrom的用法和作用,展示了其在构建链式协程中的功能。最后,文章重点讲解了asyncio库,包括事件循环、Future和Task的概念,并通过示例演示了如何使用async/await实现异步IO操作,以及获取协程返回值的两种方法。

异步IO:就是发起一个IO操作(如:网络请求,文件读写等),这些操作一般是比较耗时的,不用等待它结束,可以继续做其他事情,结束时会发来通知。

协程:又称为微线程,在一个线程中执行,执行函数时可以随时中断,由程序(用户)自身控制,执行效率极高,与多线程比较,没有切换线程的开销和多线程锁机制。

协程基础

从语句上看,协程和生成器类似,都是包含了yield关键字,不同之处在于协程中yield关键词通常出现在=右边,可以产出值a(y = yield a)或不产出值时为None(y = yield)。调用方可以用send函数发送值给协程。

激活协程时在yield处暂停,等待调用方发送数据,下次继续在yield暂停。从根本上看,yield是流程控制的工具,可以实现协作式多任务,这也是后面讲解异步IO的基础。

最简单的协程示例

使用协程时需要预激活(next函数)后才能使用send发送值。(a = yield b),next时会产出yield右边的值b,send时接收值的是yield左边的值a

示例代码

def cor_example(name):
    print('start coroutine name: ', name)
    x = yield name
    print('send值: ', x)
coro = cor_example('lyy')
print('next 返回的值: ', next(coro))
print('send 返回的值: ', coro.send(6))

输出结果

start coroutine name: lyy

next 返回的值: lyy

send值: 6

Traceback (most recent call last):

File "D:/project/test/test_xc.py", line 9, in <module>

print('send 返回的值: ', coro.send(6))

StopIteration

Process finished with exit code 1

必须先调用next()函数预激活协程,不然send()函数无法使用。

调用next()时,产出yield右边的值后暂停不再往yield的下一行执行(一般不需要next产出值),等待send的到来,调用send()时,产出值赋给x(可对x作进一步处理),并往下运行。

协程结束时会跟生成器一样抛出StopIteration的异常给调用方,调用方可以捕获它后处理。

让协程返回值以及yield from说明

<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值