【19】Python3 - 协程

  • 协程是为非抢占式多任务产生子程序的计算机程序组件。
  • 协程允许不同入口点在不同位置暂停或开始执行程序。可以从技术上理解协程是一个可以随时中断执行的函数。
  • 实现协程比较有名的包有asyncio,tornado,gevent
  • 协程的实现:
    • yield返回值
    • send调用
    • 同时协程还需要next()进行预激
    • 概括协程的实现过程:首先定义一个协程(可通过在函数中使用yield),其次生成一个协程(本质是生成器),进行预激(通过next()),主协程通过send()给变量赋值,逐步执行,直到抛出StopIteration异常。
# 协程代码案例
def simple_coroutine():
    print('-> start')
    x = yield
    print('-> received',x)
   
# 主线程
sc = simple_coroutine()  # 先生成一个协程(生成器)

print(1111)
# 可以使用sc.send(None),效果一样
next(sc)  # 预激,本案例中执行了协程,执行到yield为止
print(2222)
sc.send('hahahh')
  • 协程的四个状态

    • inspect.getgeneratorstate(…) 函数确定协程的状态,该函数会返回下述字符串中的一个:
    • GEN_CREATED:等待开始执行
    • GEN_RUNNING:解释器正在执行
    • GEN_SUSPENED:在yield表达式处暂停
    • GEN_CLOSED:执行结束
  • 协程终止

    • 协程中未处理的异常会向上冒泡,传给next函数或send方法的调用方(即触发协程的对象)
    • 如果想中途终止协程,发送某个哨符值,让协程退出。协程执行的每一步,判断是否哨符值是否是退出标志。内置的 None 和Ellipsis 等常量经常用作哨符值。
    • 如果为了得到返回值,那么协程必须正常终止,而不是抛出其他异常的终止。如果协程正常终止,生成器会发出StopIteration异常,异常对象的value属性保存返回值(return 后的值)。
  • yield from

    • yield from从内部捕获StopIteration异常。
    • yield from功能类似于一个通道。主线程给yield from 传值(send()),然后yield from 直接又传值给协程。返回值的时候,协程先把值返回给yield from,然后yield from在把返回值返回给主线程。yield from的作用
  • 委派生成器
    - 包含yield from 表达式的生成器函数就是委派生成器
    - 委派生成器在yield from表达式处暂停,调用方可以直接把数据发给子生成器
    - 子生成器在把产出的值发给调用方
    - 子生成器在最后,解释器会抛出StopIteration,并且把返回值附加到异常对象上
    委派生成器

注:本文是本人根据北京图灵学院的python课程自己整理的笔记哒,转载请注明出处哈~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值