BRPC是baidu内部自研的一套RPC框架,除了易用性、高性能之外,核心的一个亮点就是当中完整实现了一套M->N的Green Threading(类似Golang的Goroutine)。
1)BRPC在公司内部大量使用,每天的工作基本上都绕着brpc转也不为过;
2)因为自己最早是写C出身的,自然对Golang喜欢的不行,Goroutine也用得不要太开心,但是一直没有对Goroutine的原理进行学习。
借此机会,希望通过对bthread的梳理,能管中窥豹M->N Green Threading。
https://github.com/apache/incubator-brpc
线程模型梳理
Green Threading本质上也算是种线程模型,为了更好地理解Green Threading的价值,我们先八股地梳理下常见的线程模型。
一个连接对应一个线程
最基础的线程模型,大概的思路就是一个线程负责Accept Incoming请求,然后自己或者交给另一个线程负责执行业务逻辑。
常规的变(套)化(路):
1)ThreadPool:如果Acceptor自己执行业务逻辑的话,可能就会Hang住新Connection的建立;那么每次来一个新Connection,重新拉一Thread起来成本又太高,那就搞一个ThreadPool;
2)SO_REUSEPORT:ThreadPool顶多算是解