当前位置: 首页 > news >正文

11.协程的概念

讲述了携程的概念、应用场景及实现原理,重点分析了同步与异步编程的区别,通过多个代码示例演示了携程如何结合IO操作实现高效的并发处理,并讲解了基于`setjmp/longjmp`和`ucontext`实现携程切换的技术细节。

一、课程概述与大纲回顾

  • 课程目标
    • 从网络编程基础出发,逐步深入讲解携程(协程)的原理与实现。
    • 结合`native`库源码分析携程如何解决并发IO问题。
  • 课程结构回顾
    • 网络编程(`select/poll/epoll`、`react`框架)
    • 网络并发测试(百万连接支持)
    • 网络API底层实现(本次未讲,下节课安排)
    • 携程专题(本节课重点)

二、携程引入背景

  • 核心问题
    • 为什么已有进程、线程,还需携程?
  • 同步与异步编程对比
    • 同步编程:串行执行,逻辑清晰但性能低。
    • 异步编程:并发执行,性能高但逻辑复杂。
    • 理想状态:同步的编程方式 + 异步的性能。

三、同步与异步编程演示

  • 示例:DNS请求
    • 同步方式:逐个请求,等待结果返回。
      • 代码特点:单线程循环发送请求。
      • 执行时间:约0.98秒。
    • 异步方式:批量发送请求,结果通过回调处理。
      • 代码特点:使用线程池处理IO读写。
      • 执行时间:约0.166秒。
    • 结论:异步性能显著优于同步。

四、异步编程的优缺点

  • 优点
    • 高并发处理能力。
    • 资源利用率高。
  • 缺点
    • 逻辑复杂,难以维护。
    • 回调嵌套导致代码可读性差。
  • 说白了,同步就是我去点菜,这个厨师做好了,我才能去找下一个厨师要菜。
  • 异步就是我问第一个厨师,做好了端走,没做好直接去问下一个。
  • 但是在代码中各种嵌套飞雷神,导致逻辑混乱。
  • 所以要引入协程的概念

五、携程的引入与作用

  • 携程定义
    • 用户态线程,由程序控制切换。
    • 单线程内实现多任务并发。
  • 核心优势
    • 同步的编程体验。
    • 异步的性能表现。
  • 应用场景
    • 客户端并发请求(如HTTP、Redis、MySQL)
    • 服务端高并发IO处理(如Web Server、KV存储)

六、携程实现原理

  • 核心原语操作
    • 切换(`switch`):从一个携程切换到另一个。
    • 调度:由调度器管理携程的执行顺序。
  • 实现方式
    • `setjmp/longjmp`
      • 保存/恢复执行上下文。
      • 适用于简单切换。
    • `ucontext`
      • 提供完整的上下文管理。
      • 支持栈切换,适合复杂携程实现。

七、`setjmp/longjmp`实现携程切换

  • 函数说明
    • `setjmp(env)`:保存当前上下文。
    • `longjmp(env, val)`:跳转到保存的上下文。
  • 代码示例
    • 实现三个函数间的跳转。
    • 模拟携程切换逻辑。
  • 局限性
    • 不支持栈切换。
    • 多线程中使用复杂。

八、`ucontext`实现携程切换

  • 函数说明
    • `getcontext()`:获取当前上下文。
    • `makecontext()`:设置上下文入口函数。
    • `swapcontext()`:切换上下文。
  • 代码示例
    • 创建三个携程(`function1`, `function2`, `function3`)。
    • 使用调度器(`main context`)控制切换顺序。
  • 优势
    • 支持完整的上下文切换。
    • 可管理多个携程的执行栈。
  • 调度策略
    • 轮询调度:对携程索引取模决定执行顺序。
  • 保存当前位置,切换到目标位置,执行完以后,再回来。也就是飞雷神二段。

九、携程与调度器设计

  • 调度器作用
    • 避免携程直接互切,提升可控性。
    • 管理携程生命周期与执行顺序。
  • 实现方式
    • 使用`main context`作为调度器。
    • 调度逻辑:`while`循环 + 索引取模。
  • 调度策略
    • 简单轮询。
    • 后续可扩展为优先级调度、事件驱动等。

十、携程与IO操作结合

  • 核心思想
    • 在IO操作前判断是否就绪。
    • 若未就绪,切换到其他携程。
  • 实现步骤
    • 使用`poll`检测IO就绪状态。
    • 若未就绪,调用`swapcontext`切换。
    • IO就绪后恢复执行。
  • 效果
    • 构建多个携程并发处理IO。
    • 每个携程对应一个IO任务。

十一、课程总结与作业

  • 本节课核心内容
    • 同步与异步编程对比。
    • 携程定义与作用。
    • 携程实现技术(`setjmp/longjmp`、`ucontext`)。
    • 携程调度器设计。
    • 携程与IO结合的实现逻辑。
  • 课后作业
    • 列举十个互联网产品中存在多个并发请求的页面。
    • 思考如何使用携程优化这些场景。
    • 尝试用`ucontext`实现一个简单的携程库。

微信界面。有好友列表,聊天窗口,右上角的加号。以及下方的菜单。可以设计一个main、加载的时候挨个轮询。其中好有列表要保持高优先级。同时好友列表里面有很多个好有,这些好友统一封装成一个库,设置一个接口。协程先问这个库有没有消息发过来。然后由这个库来管理各种好有发来的消息。同时新增好有也添加进来。这样协程就不用为每一个好友服务了。

类似于我班长本来要管50个人,现在10个人设置一个小组长。这样我只需要管5个人

http://www.jsqmd.com/news/530709/

相关文章:

  • 2026国际搬家优质品牌推荐全指南 - 优质品牌商家
  • LiveDraw:实时屏幕绘画工具,3步解决演示标注难题
  • FOC相电流采样避坑指南:从采样震荡到扇区切换,这些细节你注意了吗?
  • HunyuanVideo-Foley私有部署镜像:RTX4090D 24G一键部署,5分钟搞定AI音效生成
  • HY-Motion 1.0安全部署:模型权限管理与API防护策略
  • 2019~2025年更新大众点评数据,商家店铺,电话,评分,营业时间,名称地址经纬度,消费价格,支持外卖,收录时间等字段~不指定年份的话,默认报价是2025年。默认发2025年的
  • Qwen3-4B极速文本对话镜像深度体验:多轮对话流畅,参数调节灵活
  • Python张量加速实战手册(GPU利用率从38%飙至99%的7步法)
  • 深度解析PingFangSC:如何重塑企业级中文字体应用的技术格局
  • 运算符(重要:++、--)
  • # 推荐系统学习笔记-05
  • 3步完成模型部署:Nanbeige 4.1-3B 极简版WebUI在星图平台的上手体验
  • damaihelper:公平购票的技术解决方案
  • ANSYS APDL模态分析实战:如何用20行命令搞定结构振动问题
  • 如何在5分钟内快速上手Adafruit GFX图形库:Arduino显示开发的完整指南
  • ANSYS Box Color 和 Transparent 应变为可编辑状态 无法选中 解决办法
  • Flink 最少处理一次和恰好处理一次
  • Phi-4-Reasoning-Vision企业实操:多用户并发图文推理服务部署架构设计
  • FastAdmin弹窗自定义全攻略:从按钮配置到宽高调整一步到位
  • 新手必看:YOLOv10官版镜像使用教程,从预测到训练一网打尽
  • 轻量级调控工具GHelper:性能优化的颠覆式解决方案
  • 通义千问3-4B资源推荐:从镜像获取到性能优化,一站式指南
  • Android Binder死亡通知机制保姆级源码解析:从Java到C++再到内核的完整链路
  • 上海正规注册文创公司服务机构推荐榜 - 优质品牌商家
  • 终极指南:如何免费实现PC微信QQ消息防撤回,告别信息丢失烦恼
  • 性能调优实战:提升OpenClaw在nanobot镜像上的任务响应速度
  • Llama-3.2V-11B-cot多模态推理实战:支持中文提问+英文图像描述双向理解
  • Windows开机自启应用开机后延迟很长时间 才启动 解决方法
  • NaViL-9B惊艳效果展示:中英文混合图文问答真实生成作品集
  • RexUniNLU批量分析技巧:控制并发、处理超时、解析嵌套结果全攻略