异步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说明
<

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

871

被折叠的 条评论
为什么被折叠?



