前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微信phxrpc源码分析(四)-phxrpc协程设计思路

微信phxrpc源码分析(四)-phxrpc协程设计思路

原创
作者头像
路小饭
修改2019-03-05 14:38:33
1.2K0
修改2019-03-05 14:38:33
举报

本章继续介绍下phxrpc协程设计思路。看看别人是怎么包装底层库的。

1 UThreadRuntime设计思路

phxrpc的协程对外暴露的接口在UThreadRuntime中,这个类封装了操作系统提供的协程基础函数。并保证了多个协程间的切换是有序的

  1. UThreadRuntime设计核心是一个vector、三个方法。一个vector是图中的ContextSlot0,三个方法是Create、Resume、Yield
  2. vector存在的目的是:一个线程中同时存在多个协程,这些协程应该放在一个可索引的容器里,让外面的逻辑很容易调度到
  3. ContextSlot封装了当前协程的状态:UTHREAD_SUSPEND\UTHREAD_SUSPEND等。也封装了协程的调度方法,Resume、Yield和Make
  4. UThreadContextSystem类封装了基础的方法:getcontext、makecontext、swapcontext
  5. 用户需要关心的就是UTreadRuntime中的Create、Resume和Yield方法

2 phxrpc的协程是如何执行自定义方法的

阅读源码时候,很多同学会关注自定义的方法是如何执行的。自定义方法通过UThreadRuntime的create接口传入,但具体到在UThreadContextSystem::Resume和UThreadContextSystem::Yield之间是如何切换的,需要额外说明下。

首先上图的情形对应到程序大概是下面这样子:

代码语言:txt
复制
UThreadRuntime runtime_;

int id = runtime_.Create; //传入自定义方法

runtime_.Resume(id);//执行自定义方法,具体到上图,就是执行uc->func_方法,箭头1处

//自定义方法uc->func_执行过程中调用了runtime_Yield()方法,箭头2处
//跳出自定义方法,继续执行下面的函数流程,箭头3处
…………
runtime_.Resume(id)//在需要的地方回到自定义方法un->func_内继续执行,箭头4\5处
  • 这里为了好理解,把swapcontext函数分割成了swapcontext begin和swapcontext end,自定义方法是在swapcontext中执行的
  • 注意Resume和Yield方法虽然都调用了swapcontext,但协程调度顺序是有区别的,Resume是swapcontext(main now),Yield是swapcontext(now main),now代表当前协程,main是主协程

3 协程的回收

在使用协程中,需要注意协程也是需要回收的。这就需要写程序时候,关注协程的生命周期,分两种情况:

  1. 如果想在程序正常存活期间该协程一直存在,那么自定义的协程方法应该是while或者for循环,保证自定义方法不会停止
  2. 如果该协程是一次性的,那么应该关注该协程结束后的处理流程

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 UThreadRuntime设计思路
  • 2 phxrpc的协程是如何执行自定义方法的
  • 3 协程的回收
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档