Tars-Cpp 协程实现分析
时间:2026-10-21 18:27 来源:未知 人气:
一、前言
Tars 是 Linux 基金会的开源项目
(https://github.com/TarsCloud),它是基于名字服务使用
Tars 协议的高性能 RPC 开发框架,配套一体化的运营管理平台,并通过伸缩调度,实现运维半托管服务。Tars 集可扩展协议编解码、高性能
RPC
通信框架、名字路由与发现、发布监控、日志统计、配置管理等于一体,通过它可以快速用微服务的方式构建自己的稳定可靠的分布式应用,并实现完整有效的服务治理。
Tars 目前支持 C++,Java,PHP,Nodejs,Go 语言,其中 TarsCpp 3.x 全面启用对协程的支持,服务框架全面融合协程。本文基于TarsCpp-v3.0.0版本,讨论了协程在TarsCpp服务框架的实现。
二、协程的介绍
2.1 什么是协程
协程的概念最早出现在Melvin Conway在1963年的论文("Design of a separable transition-diagram compiler"),协程认为是“可以暂停和恢复执行”的函数。
协程可以看成一种特殊的函数,相比于函数,协程最大的特点就是支持挂起(yield)和恢复(resume)的能力。如上图所示:函数不能主动中断执行流;而协程支持主动挂起,中断执行流,并在一定时机恢复执行。
协程的作用:
- 降低并发编码的复杂度,尤其是异步编程(callback hell)。
- 协程在用户态中实现调度,避免了陷入内核,上下文切换开销小。
2.2 进程、线程和协程
我们可以简单的认为协程是用户态的线程。协程和线程主要异同:
- 相同点:都可以实现上下文切换(保存和恢复执行流)
- 不同点:线程的上下文切换在内核实现,切换的时机由内核调度器控制。协程的上下文切换在用户态实现,切换的时机由调用方自身控制。
进程、线程和协程的比较:
2.3 协程的分类
按控制传递(Control-transfer)机制分为:对称(Symmetric)协程和非对称(Asymmetric)协程。
- 对称协程:协程之间相互独立,调度权(CPU)可以在任意协程之间转移。协程只有一种控制传递操作(yield)。对称协程一般需要调度器支持,通过调度算法选择下一个目标协程。