当前位置:网站首页>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);
边栏推荐
猜你喜欢

88Q2110 通过C22方式访问C45 phy地址

The statistical data analysis, interview manual"

进程间通信方式(2)有名管道

项目构建工具-Gradle入门

【Video】Report Sharing | 2021 Insurance Industry Digital Insights

两日总结十一

HCIP-R&S By Wakin自用笔记(3)OSPF之引入外部路由、Forwarding-Address、汇总、特殊区域

Is container technology really the savior of environmental management?

络达开发---自定义Timer的实现

第二课第一周第4-6节 医学预后案例欣赏+作业解析
随机推荐
软件测试面试题:对 RUP,CMM,CMMI,XP,PSP,TSP 的认识?
数据的存储(下)——浮点型在内存中的存储
【oops-framework】模板项目【oops-game-kit】使用简介
年薪30W,BAT抢着要,懂面试技巧的测试人究竟多吃香?
生信实验记录(part2)--tf.reduce_sum()用法介绍
Data Analysis Interview Manual "SQL"
MySQL - 一条SQL在MySQL中是如何被执行的?
基于 HPSO 与多核 LSSVM 的网络入侵检测
SystemVerilog: Verifying knowledge bits and pieces
vim简单保存窗口标识
php 判断数组是否为多维数组
Alibaba 最新神作!耗时 182 天肝出来 1015 页分布式全栈手册太香了
络达开发---自定义Timer的实现
测试3年,开口就要25k?面试完最多给15k...
FPGA学习专栏-串口通信(xinlinx)
How to convert url to obj or obj to url
通过微透镜阵列的传播
MySQL Basics [Part 1] | Database Overview and Data Preparation, Common Commands, Viewing Table Structure Steps
The iterator and generator
【websocket】