python基础语法27-协程异步I/O

异步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的值:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春风抚微霞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值