• gRPC闭包调度器


    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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    CentOS下MySQL安装配置
    java ssm旅游景点景区门票预订及信息发布系统
    minio双机部署
    神奇的MappedByteBuffer
    【毕业季】计算机行业现况的个人分析,请您探讨
    【9.2】687. 最长同值路径
    针对应用程序依赖库漏洞的攻击
    Linux安装及管理应用程序
    小米手机(MIUI 13)安装Fiddler CA证书
    【Mysql】 InnoDB引擎深入- 二级索引、联合索引、回表、索引覆盖
  • 原文地址:https://blog.csdn.net/cplcdk/article/details/126268210