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

微信phxrpc源码分析(三)-phxrpc协程与Tars协程对比

原创
作者头像
路小饭
修改2019-03-05 10:50:24
1.6K0
修改2019-03-05 10:50:24
举报

看完phxrpc的协程使用方式后,我们拿Tars中的协程和其做个简单对比。

1 Tars中的协程模型

ServantHandle协程调度器.png
ServantHandle协程调度器.png

TarsRPC源码解读篇:使用C++重写Tars-RPC主逻辑框架的3.2节中曾聊过Tars的协程切换流程。这里再复习一下。

  • Tars协程模型也可以理解为活在同一个线程的几个子线程(协程)在一起协调有序工作,Tars中有明确主协程、从协程概念
  • 主从协程都放在链表里
  • 主协程是_coroSched->tar_run(),在循环中通过链表切换主协程和不同的从协程
  • 从协程是通过_coroSched->createCoroutine创建的,是该方法中绑定的函数

再从链表调度角度看一下Tars的协程模型

  • 第一步,将1号从协程加入到_avail链表
  • 第二步,进入主协程的循环中,从_avail中取出第一个从协程(即1号从协程)进行切换。1号从协程中又创建了2号从协程放入_avail链表中,然后1号从协程让出当前工作,切换回主协程(注意,1号从协程是没有执行结束的,只是在等待下一次切换回来)
  • 第三步,主协程从_avail链表中取出第一个从协程(即2号从协程)进行切换,2号从协程执行结束,从_avail表中删除2号从协程,切换回主协程,这时又回到了第二步进行处理

注意:主协程和1号从协程一直处于循环中,正常接收请求时是不会结束的。2号从协程每次执行完就会从_avail中删除

2 phxrpc协程模型

  • phxrpc中主从协程是包装在里面的,没有_coroSched->tar_run()这样的主动调度,是一种顺序流的处理方式
  • 上图中标记Yeild的地方,是函数体内在执行到yeild时,需要“跳出”当前函数,继续往下面执行
  • 上图中标记Resume地方,是在执行到resume时,需要“跳出”当前流程,返回到yeild的地方继续执行
  • 为了保证resume时回到应该去的地方,引入了socket->uthread_id来标记回到的位置

3 总结

  1. Tars中使用主动调度协程切换方式,phxrpc中使用顺序流切换方式
  2. Tars中使用链表,保证主协程和从协程的切换是可控和有序的,phxrpc中使用socket->uthread_id和一个vector保证切换到指定的协程中
  3. 可以看到,协程的引入帮助rpc框架做到了“顺序编写代码,异步执行逻辑”的效果,使得在一个线程中高效完成多个任务,减少了线程切换的开销
  4. 另一方面,个人感觉追踪协程的处理流程比直接用不同的线程更费劲,可阅读Tars中的协程与非协程方式体会

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 Tars中的协程模型
  • 2 phxrpc协程模型
  • 3 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档