0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

通过例子由浅入深的理解yield协程

冬至配饺子 来源:缪斯之子 作者:肖新苗 2022-08-23 11:12 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

题记

本系列目标是通过例子由浅入深的理解协程.

读者

需要有一定的python基础, 概念部分建议阅读经典书: 流畅的python 或者 查看w3c school 或者 菜鸟教程

基本概念

生成器:只要 Python 函数的定义体中有 yield 关键字,该函数就是生成器函数,调用生成器函数返回的是生成器对象

yield关键字:总的来说就是:产出和让步,产出结果,让出控制权

send:send() 方法致使协程前进到下一个yield 语句,另外,生成器可以作为协程使用

例子说明

yield的执行流程, 并制作了一个生成器调用的共同方法print_value

def yield1():
'''
整体解释:1将作为第一个send方法的返回值,b是第二个send方法的参数,
最后的return是作为最后一个send方法的返回值
'''
# 4.yield1()协程:阻塞在此,执行yield产出结果为1,把控制权给主线程
# 9.yield1()协程:阻塞解除,获得输入值2,并赋值给b
b = yield 1
# 10.yield1()协程:返回b
return b


def yield2():
'''
协程阻塞在此,执行yield产出结果为None,并交出控制权给主线程
注: 因为yield后面没有值,所以是None
'''
yield
# 如果没有返回值,会return None
pass


def yield3():
yield 1


def print_value(f, args):

try:
# 3.print_value方法:对yield1()协程执行send
# 5.print_value方法:接收yield1()协程的返回值1,并赋值给b
# 8.print_value方法:对yield1()协程再次执行send,并传入2
b = f.send(args)
except StopIteration as e:
'''
11.print_value方法:接收yield1()协程的返回值,
如果是最后一个迭代,就会进入到这个异常捕获
'''

print(f'{f.__name__}返回值 {e.value}')
return e.value
else:
# 6.print_value方法:打印b
print(f'{f.__name__}接收 {b}')

'''

1.主线程:`yield1`是生成器函数,`yield1()`调用生成器函数,

返回生成器对象也可以称作协程
'''
ys = [yield1(), yield2(), yield3()]
for y in ys:
# 2.主线程:y是yield1()生成器对象,第一次发送None
# 12.主线程:y是yield2()生成器对象,第一次发送None.
# 注:yield2 yield3根yield1差不多所以12步以后的都略过了
print_value(y, None)
# 7.主线程:第二次send参数为2
print_value(y, 2)


结果:
yield1接收 1
yield1返回值 2
yield2接收 None
yield2返回值 None
yield3接收 1
yield3返回值 None


审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 生成器
    +关注

    关注

    7

    文章

    322

    浏览量

    22509
  • python
    +关注

    关注

    57

    文章

    4858

    浏览量

    89592
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    FreeRTOS任务和协的区别是什么

    定义 例程实现是通过一组宏提供的。 4. 条件限制 RAM使用量的减少是以在如何构建方面的一些严格限制为代价的。
    发表于 12-08 08:18

    ucos与freertos哪个好?

    选择uCOS或FreeRTOS取决于项目的具体需求和资源限制。 FreeRTOS的优点包括: 更小的内核ROM和RAM占用,特别是在RAM方面,适合资源受限的嵌入式系统。 支持
    发表于 12-05 07:13

    通过API接口使用关键词搜索酒店列表

    技术实践: 导语:在开发旅游或酒店预订相关的应用程序时,集成第三方平台的酒店数据是常见需求。携作为国内领先的在线旅游服务平台,提供了丰富的API接口供开发者使用。本文将聚焦于如何使用携提供
    的头像 发表于 11-17 14:57 196次阅读
    <b class='flag-5'>通过</b>携<b class='flag-5'>程</b>API接口使用关键词搜索酒店列表

    通过接口获取携酒店详情数据的技术实现

     技术分享: 在开发旅游类应用时,整合酒店数据是常见需求。本文将以技术视角探讨如何通过接口获取携平台的酒店详情数据(注:实际商用需获得官方授权)。 一、接口调用基础 认证机制 通常需要申请
    的头像 发表于 11-17 14:15 136次阅读
    <b class='flag-5'>通过</b>接口获取携<b class='flag-5'>程</b>酒店详情数据的技术实现

    NICE处理器接口信号解读--以demo为例

    的复位信号。 nice_active表示nice处理器是否正在工作,但该信号在上层文件中未例化,如下图所示。 nice_mem_holdup信号在e203_lsu_ctrl.v文件中用于覆盖cpu
    发表于 10-31 08:01

    利用Verdi调试处理器的实现步骤

    的search forward工具按钮搜索nice_req_valid信号以追踪到主处理器发起的调用请求信号。 结果如下图所示。 小结 本文梳理了调试过程中的技巧,通过调试发现处理器设计不周到的地方,因为能力有限,若是理解
    发表于 10-30 08:26

    MD5信息摘要算法实现二(基于蜂鸟E203处理器)

    本设计首先根据MD5处理器的功能设计MD5算法IP核,软件部分使用串口程序助手进行64位加解密结果的输出,E203内核根据地址取出对应的数据,使用相关的指令进行传输显示。通过NICE接口将MD5
    发表于 10-30 07:54

    NICE处理器demo分析及测试

    实现思路: 1.硬件设计,编写相应的verilog文件,需要注意的是NICE处理器定义了一些基本的接口; 2.编写驱动,通过内联汇编的伪指令.insn配置相关的驱动设置; 3.编写用于测试
    发表于 10-23 07:05

    基于E203 NICE处理器扩展指令

    1、实现功能 基于官方提供的demo nice的硬件代码,设计一个基于e203 nice处理的加法器。 2NICE处理器理论学习 nice处理器的作用主要是用于控制通路的管理 去年
    发表于 10-21 14:35

    广汽星源增技术暨昊铂HL增版上市发布会定档

    近年来,增赛道火热,但不少增车一遇亏电,驾驶体验感急转直下。作为中国增技术开创者之一,广汽集团将于8月19日举办广汽星源增技术暨昊铂HL增
    的头像 发表于 08-14 16:44 965次阅读

    LuatOS深度解析:小白也能10分钟学会,代码效率直接起飞!

    是基于Lua语言实现的协作式并发控制机制,专为嵌入式及物联网场景设计, 其核心特点是通过用户态任务调度,在单线程中模拟多任务执行。 LuatOS通过轻量化协作式调度,在资源受限的嵌
    的头像 发表于 04-10 15:23 457次阅读
    LuatOS<b class='flag-5'>协</b><b class='flag-5'>程</b>深度解析:小白也能10分钟学会,代码效率直接起飞!

    10分钟上手写代码,LuatOS轻松掌握!

    10分钟学会LuatOS,从此你的程序也能像通勤族利用碎片时间一样游刃有余。现在就去动手试一试,开启异步编程新体验! 写给第一次听说的你‌: 别怕!
    的头像 发表于 04-10 15:18 495次阅读
    10分钟上手写代码,LuatOS<b class='flag-5'>协</b><b class='flag-5'>程</b>轻松掌握!

    电机冲刺北交所上市

    近日,北交所网站显示,常州三电机股份有限公司(以下简称“三电机”)答复了第二轮问询函。三电机此前于2023年12月29日IPO申请获北交所受理。
    的头像 发表于 03-28 17:53 1762次阅读

    进程、线程、傻傻分不清?一文带你彻底扒光它们的\"底裤\"!

    权(yield)实现协作,单线程内玩出多任务的感觉。 技术细节: 切换成本≈打哈欠(0.1μs~1μs) 阻塞操作会直接让出CPU(比如等待网络请求时,自动切换到其他
    发表于 03-26 09:27

    通过高新技术企业复审

    2024年12月11日,广东省全国高新技术企业认定备案公示,广州万通信息技术有限公司通过2024年全国高新技术企业认定报备复审。 万通是国家级专精特新重点“小巨人”企业、是“广东省信息安全芯片
    的头像 发表于 12-13 09:53 1073次阅读