当前位置:网站首页>gRPC闭包调度器
gRPC闭包调度器
2022-08-11 01:44:00 【real沛林】
ExecCtx
代码中对这个结构的作用说明是在调用栈上收集数据信息。
考虑下面的场景:
A,B,C,D为4个依次调用的函数,B执行过程中调度了一个闭包1,并希望其在返回到A时执行。D同样调度了闭包2,也希望返回到A时再执行。这个时候就要使用这个调度器了grpc_schedule_on_exec_ctx.
要达到这种目的,我们要做的就是在A中声明ExecCtx,然后在B,D中调度绑定给grpc_schedule_on_exec_ctx调度器的闭包,然后在返回A时调用ExecCtx的Flush方法,这样就能达到目的了.ExecCtx内部维护了一个队列,用于存放调度给它的闭包。调用Flush方法时再依次从队列中取出闭包并运行。
在最新的gRPC版本中,简化了这种调度器的使用方法。gRPC框架为每个线程创建了这个ExecCtx,并存放在线程私有变量中,当需要时,只需要调用grpc_core::ExecCtx::Get()即可获取并使用。
链接:https://blog.csdn.net/happyAnger6/article/details/102753742
Flush
图14-2演示了Flush是如何调度任务的
1、2箭头过后,已经把readable或者writable的任务放入了closure_list中3箭头开始for循环执行Flush操作,Flush会执行closure_list的任务,当closure_list为空后,会执行combiner_data中的任务
- 第一种场景:执行closure_list中的job1,又生成了新的job1-1放入了closure_list中,见路径:4-4.1-4.2-4.3
- 第二种场景:执行closure_list中的job1,又生成了新的job1-1放入了combiner_data中,见路径:4-4.1-4.4-4.5
- 第三中场景:执行combiner_data中的job2,又生成了新的job2-1放入了combiner_data中,见路径:5-5.1-5.2-5.3
- 第四种场景:执行combiner_data中的job2,又生成了新的job2-1放入了closure_list中,见路径:5-5.1-5.4-5.5
链接:https://zhuanlan.zhihu.com/p/63817217
combiner
// Note that the 'write_action_begin_locked' closure is being scheduled
// on the 'finally_scheduler' of t->combiner. This means that
// 'write_action_begin_locked' is called only *after* all the other
// closures (some of which are potentially initiating more writes on the
// transport) are executed on the t->combiner.
//
// The reason for scheduling on finally_scheduler is to make sure we batch
// as many writes as possible. 'write_action_begin_locked' is the function
// that gathers all the relevant bytes (which are at various places in the
// grpc_chttp2_transport structure) and append them to 'outbuf' field in
// grpc_chttp2_transport thereby batching what would have been potentially
// multiple write operations.
//
// Also, 'write_action_begin_locked' only gathers the bytes into outbuf.
// It does not call the endpoint to write the bytes. That is done by the
// 'write_action' (which is scheduled by 'write_action_begin_locked')
t->combiner->FinallyRun(
GRPC_CLOSURE_INIT(&t->write_action_begin_locked,
write_action_begin_locked, t, nullptr),
GRPC_ERROR_NONE);
边栏推荐
猜你喜欢
络达开发---串口日志&日志过滤
最新国产电源厂家及具体型号pin-to-pin替代手册发布
Lianshengde W801 series 5-WeChat applet and W801 Bluetooth communication routine (read notes)
#yyds Dry Goods Inventory#[Yugong Series] August 2022 Go Teaching Course 008-Integer of Data Types
联盛德W801系列6-从微信小程序的角度来分析W801的蓝牙通信源码(indicate方式)
导入数据包上传宝贝提示“类目不能为空”是什么原因,怎么解决?
OptiFDTD应用:用于光纤入波导耦合的硅纳米锥仿真
从键入网址到网页显示的详细过程
项目构建工具-Gradle入门
两日总结十一
随机推荐
R语言多元线性回归、ARIMA分析美国不同候选人对经济GDP时间序列影响
This Thursday evening at 19:00, Lesson 5 of the sixth phase of knowledge empowerment丨OpenHarmony WiFi subsystem
Dual machine thermal for comprehensive experiment (VRRP + OSPF + + NAT + DHCP + VTP PVSTP + single-arm routing)
R language multiple linear regression, ARIMA analysis of the impact of different candidates in the United States on the economic GDP time series
Linux install redis database
漏洞管理计划的未来趋势
基于 HPSO 与多核 LSSVM 的网络入侵检测
MSTP - Multiple Spanning Tree (Case + Configuration)
Flink二阶段提交
请讲一讲JS中的 for...in 与 for...of (下)
MySQL八股文背诵版(续)
Please talk about for...in and for...of in JS (below)
生信实验记录(part2)--tf.reduce_sum()用法介绍
联盛德W801系列5-微信小程序与W801蓝牙通信例程(阅读笔记)
loop word
项目构建工具-Gradle入门
如何实现FPGA的可重复性设计
安装dlib库
[ASM] The relationship between the role of the bytecode operation ClassWriter COMPUTE_FRAMES and visitMaxs
FPGA learning column (xinlinx) serial communication -