当前位置:网站首页>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);
边栏推荐
猜你喜欢
随机推荐
【iframe父页面调用子页面的方法】踩坑:获取元素的时候需要用 `[x]`是关键,不能用`.eq(x)`否则获取不到。
Summary of DDL routine operations in MySQL
软件测试面试题:什么是α测试,β测试?
TRCX:掺杂过程分析
postgresql parameter meaning
软件测试面试题:单元测试的策略有哪些?
Sigma development pays attention to details
sql 使用到where和groupby时到底怎么建立索引?
FPGA学习专栏-串口通信(xinlinx)
C# WebBrower1控件可编辑模式保存时会提示“该文档已被修改,是否保存修改结果”
漏洞管理计划的未来趋势
软件测试面试题:什么是数据的对立性,有几个层次?
【备战“金九银十”】2022年软件测试面试题最新汇总
nvidia-smi详解
通过热透镜聚焦的高斯光束
MySQL中的DDL常规操作总结
软件测试面试题:软件测试的过程的V模型,说出它的缺点?
Engineering Design of Single-sided PCB Routing Impedance
How to create an index when sql uses where and groupby?
Sub-database sub-table ShardingSphere-JDBC notes arrangement









