异步IO:就是发起一个IO操作(如:网络请求,文件读写等),这些操作一般是比较耗时的,不用等待它结束,可以继续做其他事情,结束时会发来通知。
协程:又称为微线程,在一个线程中执行,执行函数时可以随时中断,由程序(用户)自身控制,执行效率极高,与多线程比较,没有切换线程的开销和多线程锁机制。
python中异步IO操作是通过asyncio来实现的。
1.协程
协程和生成器类似,都是包含了yield关键字,不同之处在于协程中yield关键词通常出现在=右边,可以产出值a(y = yield a)或不产出值时为None(y = yield)。调用方可以用send函数发送值给协程。
激活协程时在yield处暂停,等待调用方发送数据,下次继续在yield暂停。从根本上看,yield是流程控制的工具,可以实现协作式多任务,这也是后面讲解异步IO的基础。
协程示例:
def demo(name):
print('开始协程的名字:',name)
x = yield name#调用next()时,产出yield右边的值后暂停;调用send()时,产出值赋给x,并往下运行
print('发送的值:',x)
c = demo('jack')
print('next的返回值:',next(c))
print('发送的返回值:',c.send(6))
结果如下:
Traceback (most recent call last):
File "C:\Users\63135\进程线程\test.py", line 27, in <module>
开始协程的名字: jack
next的返回值: jack
发送的值: 6
print('发送的返回值:',c.send(6))
StopIteration
总结:
必须先调用next()函数预激活协程,不然send()函数无法使用。
调用next()时,产出yield右边的值后暂停不再往yield的下一行执行(一般不需要next产出值),等待send的到来,调用send()时,产出值赋给x(可对x作进一步处理),并往下运行。
协程结束时会跟生成器一样抛出StopIteration的异常给调用方,调用方可以捕获它后处理。
获取协程的返回值示例:
def demo(name):
print('开始协程的名字:',name)
while True:
x = yield name#调用next()时,产出yield右边的值后暂停;调用send()时,产出值赋给x,并往下运行
if x is None:
return 'ID:jack'
print('发送的值:',x)
c = demo('jack')
next(c)
print('发送的返回值:',c.send(6))
try:
c.send(None)
except StopIteration as e:
print('返回值:',e.value)
结果如下:
开始协程的名字: jack
发送的值: 6
发送的返回值: jack
返回值: ID:jack
yeild from示例:
def demo(name):
print('开始协程名字:', name)
x = yield name #调用next()时,产出yield右边的值后暂停;调用send()时,产出值赋给x,并往下运行
print('发送的值:', x)
return 'ID: Jack'
def group2():
data = yield from demo('Jack') #在此处暂停,等待子生成器的返回后继续往下执行
print('data的值:', data)
return data
def group():
res = yield from group2() #在此处暂停,等待子生成器的返回后继续往下执行
print('res的值:
python基础语法27-协程异步I/O
最新推荐文章于 2023-01-23 12:51:11 发布