(原创)C/C语言, 平台是debian10, grpc版本:grpc-c/1.25.0-dev grpc-c/8.0.0, 使用的例子是自带的例子GreeterClient

创建 default-executor 和 resolver-executor 线程的主要流程,创建channel时会创建这2个线程

graph TD;
000(grpc::InsecureChannelCredentials #credentials.h:91 调用InsecureChannelCredentials)-->001(grpc_impl::InsecureChannelCredentials #insecure_credentials.cc:59 创建一个共享的InsecureChannelCredentialsImpl对象)

001-->002(grpc_impl::InsecureChannelCredentialsImpl::InsecureChannelCredentialsImpl #insecure_credentials.cc:30 调用父类ChannelCredentials构造函数)

002-->003(grpc_impl::ChannelCredentials::ChannelCredentials #credentials_cc.cc:25 调用父类GrpcLibraryCodegen构造函数)

003-->004(grpc::GrpcLibraryCodegen::GrpcLibraryCodegen #grpc_library.h:45 调用GrpcLibraryInterface的init)

004-->005(grpc::internal::GrpcLibrary::init #grpc_library.h:34 调用grpc_init)

005-->006(grpc_init #init.cc:146 调用grpc_iomgr_init)

006-->007(grpc_iomgr_init #iomgr.cc:60 调用grpc_core::Executor::InitAll)

007-->008(创建 default-executor 和 resolver-executor 线程)

008-->009(grpc_iomgr_start #iomgr.cc:69 调用grpc_timer_manager_init)

009-->010(grpc_timer_manager_init #timer_manager.cc:311 调用start_threads)

010-->011(start_threads #timer_manager.cc:293 调用start_timer_thread_and_unlock)

011-->012(start_timer_thread_and_unlock #timer_manager.cc:91 启动grpc_global_timer线程)

grpc Unary模式下客户端启动到执行grpc_connector_connect的主要流程

graph TD;
000(grpc::internal::BlockingUnaryCall #client_unary_call.h:43)-->001(grpc::internal::BlockingUnaryCallImpl::BlockingUnaryCallImpl #client_unary_call.h:71 创建CompletionQueue, Call, CallOpSet对象, 设置CallOpSet对象参数, 调用PerformOps)

001-->002(grpc::internal::Call::PerformOps #call.h:69 调用PerformOpsOnCall)

002-->003(grpc_impl::Channel::PerformOpsOnCall #channel_cc.cc:164 调用FillOps)

003-->004(grpc::internal::CallOpSet::FillOps #call_op_set.h:874 调用ContinueFillOpsAfterInterception)

004-->005(grpc::internal::CallOpSet::ContinueFillOpsAfterInterception #call_op_set.h:943 调用6个op的AddOp并调用grpc_call_start_batch)

005-->006(grpc::CoreCodegen::grpc_call_start_batch #core_codegen.cc:113 调用grpc_call_start_batch)

006-->007(grpc_call_start_batch #call.cc:1974 调用call_start_batch)

007-->008(call_start_batch #call.cc:1929 根据6个ops的op->op, 设置stream_op, ops, call的参数, 最后调用execute_batch)

008-->009(execute_batch #call.cc:639 调用start_batch_closure的callback函数 execute_batch_in_call_combiner)

009-->010(execute_batch_in_call_combiner #call.cc:628 调用 elem->filter->start_transport_stream_op_batch)

010-->011(grpc_call_next_op #channel_stack.cc:227 调用 next_elem->filter->start_transport_stream_op_batch)

011-->012(grpc_core::CallData::StartTransportStreamOpBatch #client_channel.cc:2140 把batch加入pending:PendingBatchesAdd并调用PickSubchannel)

012-->013(grpc_core::CallData::PickSubchannel #client_channel.cc:3853 调用PickSubchannelLocked返回false)

013-->014(grpc_core::CallData::PickSubchannelLocked #client_channel.cc:3870 picker_是nullptr, 调用CheckConnectivityState, 参数设定为尝试连接)

014-->015(grpc_core::ChannelData::CheckConnectivityState #client_channel.cc:1956 创建closure并调用它的callback函数 TryToConnectLocked)

015-->016(closure_impl::closure_wrapper #closure.h:156 创建closure是callback函数是closure_impl::closure_wrapper, 真正的callback是 TryToConnectLocked)

016-->017(grpc_core::ChannelData::TryToConnectLocked #client_channel.cc:1946 调用CreateResolvingLoadBalancingPolicyLocked)

017-->018(grpc_core::ChannelData::CreateResolvingLoadBalancingPolicyLocked #client_channel.cc:1596 调用ResolvingLoadBalancingPolicy构造函数)

018-->019(grpc_core::ResolvingLoadBalancingPolicy #resolving_lb_policy.cc:199 创建CreateResolver, UpdateState并调用StartLocked开始解析)

019-->020(grpc_core::AresDnsResolver::StartLocked #dns_resolver_ares.cc:177 调用MaybeStartResolvingLocked)

020-->021(grpc_core::AresDnsResolver::MaybeStartResolvingLocked #dns_resolver_ares.cc:409 调用StartResolvingLocked)

021-->022(grpc_core::AresDnsResolver::StartResolvingLocked #dns_resolver_ares.cc:420 调用grpc_dns_lookup_ares_locked)

022-->023(grpc_dns_lookup_ares_locked_impl #grpc_ares_wrapper.cc:625 调用grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked)

023-->024(grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked #grpc_ares_wrapper.cc:446 使用c-ares通过dns查找ip地址, 最后调用grpc_ares_request_unref_locked)

024-->025(grpc_ares_request_unref_locked #grpc_ares_wrapper.cc:135 如果延迟的查询为0, 调用grpc_ares_ev_driver_on_queries_complete_locked)

025-->026(grpc_ares_ev_driver_on_queries_complete_locked #grpc_ares_ev_driver.cc:191 停止查询,调用grpc_timer_cancel, 参数是query_timeout)

026-->027(grpc_timer_cancel #timer.cc:35 调用grpc_timer_impl->cancel)

027-->028(timer_cancel #timer_generic.cc:474 调用 timer->closure对应的callback函数)

028-->029(on_ares_backup_poll_alarm_locked #grpc_ares_ev_driver.cc:288 调用grpc_ares_ev_driver_unref)

029-->030(grpc_ares_ev_driver_unref #grpc_ares_ev_driver.cc:112 释放资源并调用grpc_ares_complete_request_locked)

030-->031(grpc_ares_complete_request_locked #grpc_ares_wrapper.cc:151 调用on_done对应的callback函数)

031-->032(grpc_core::AresDnsResolver::OnResolvedLocked #dns_resolver_ares.cc:347 解析完成, 调用ReturnResult)

032-->033(grpc_core::ResolvingLoadBalancingPolicy::ResolverResultHandler::ReturnResult #resolving_lb_policy.cc:87 调用OnResolverResultChangedLocked)

033-->034(OnResolverResultChangedLocked #resolving_lb_policy.cc:479 获得lb_policy_name,默认pick_first, 如果lb_policy_name不为空, 则创建或者更新LB policy, 调用的是CreateOrUpdateLbPolicyLocked)

034-->035(CreateOrUpdateLbPolicyLocked #resolving_lb_policy.cc:364 创建或者更新lb_policy, 调用UpdateLocked)

035-->036(PickFirst::UpdateLocked #pick_first.cc:280 调用AttemptToConnectUsingLatestUpdateArgsLocked)

036-->037(PickFirst::AttemptToConnectUsingLatestUpdateArgsLocked #pick_first.cc:236 用latest_update_args_创建 subchannel列表, 如果列表中的subchannel有状态是GRPC_CHANNEL_READY, 则选中此subchannel, 否则选中第0个subchannel)

037-->038(AttemptToConnect #client_channel.cc:921 调用subchannel_->AttemptToConnect)

038-->039(Subchannel::AttemptToConnect #subchannel.cc:823 调用MaybeStartConnectingLocked)

039-->040(Subchannel::MaybeStartConnectingLocked #subchannel.cc:930 调用ContinueConnectingLocked)

040-->041(Subchannel::ContinueConnectingLocked #subchannel.cc:983 设置grpc_connect_in_args参数并调用grpc_connector_connect, 通过connector->vtable->connect最后调用chttp2_connector_connect)

Unary模式下客户端创建 default-executor 和 resolver-executor 线程和从启动到执行grpc_connector_connect的主要流程的更多相关文章

  1. grpc Unary模式下客户端创建insecure channel的主要流程

    (原创)C/C/1.25.0-dev grpc-c/8.0.0, 使用的例子是自带的例子GreeterClient grpc Unary模式下客户端创建insecure channel的主要流程 gr ...

  2. Unary模式下客户端从开始连接到发送接收数据的主要流程

    (原创)C/C/1.25.0-dev grpc-c/8.0.0, 使用的例子是自带的例子GreeterClient grpc Unary模式下客户端从开始连接到发送数据的主要流程 graph TD; ...

  3. 烂泥:openvpn tun模式下客户端与内网机器通信

    本文由秀依林枫提供友情赞助,首发于烂泥行天下 前两篇文章我们介绍了有关openvpn的搭建与配置文件的讲解,这篇文章我们再聊介绍下,在tun模式下openvpn客户端如何与内网机器通信的问题. 一.实 ...

  4. Azure ARM (11) ARM模式下,创建虚拟机并配置负载均衡器

    <Windows Azure Platform 系列文章目录> 本文内容比较多,请大家仔细阅读,谢谢! 在前几章中,我们做了准备工作: 1.创建ARM Resouce Group,叫Lei ...

  5. 【案例分享】使用ActiveReports报表工具,在.NET MVC模式下动态创建报表

    提起报表,大家会觉得即熟悉又陌生,好像常常在工作中使用,又似乎无法准确描述报表.今天我们来一起了解一下什么是报表,报表的结构.构成元素,以及为什么需要报表. 什么是报表 简单的说:报表就是通过表格.图 ...

  6. Azure ARM (9) 创建ARM模式下的虚拟机网络

    <Windows Azure Platform 系列文章目录> 笔者在之前几章内容中,创建了ARM Resource Group,然后在这个ARM Resource Group下创建Azu ...

  7. ARM模式下创建Express Route

    在Azure的ARM模式下,创建Express Route的命令和ASM模式下是有一些区别的. 本文将介绍在ARM模式下,如果创建Express Route的Circuit. 1. 查看支持的Serv ...

  8. ASP.NET Core3.1使用IdentityServer4中间件系列随笔(五):创建使用[Code-授权码]授权模式的客户端

    配套源码:https://gitee.com/jardeng/IdentitySolution 本篇将创建使用[Code-授权码]授权模式的客户端,来对受保护的API资源进行访问. 1.接上一篇项目, ...

  9. Nginx+Docker部署模式下 asp.net core 获取真实的客户端ip

    目录 Nginx+Docker部署模式下 asp.net core 获取真实的客户端ip 场景 过程还原 结论 参考资料 Nginx+Docker部署模式下 asp.net core 获取真实的客户端 ...

随机推荐

  1. Vue.js最佳实践--给大量子孙组件传值(provide/inject)

    开发中有个需求,有个Parent组件(例如div)下,输入框,下拉框,radiobutton等可编辑的子孙组件几百个,根据某个值统一控制Parent下面的所有控件的disabled状态 类似于这样,给 ...

  2. 尝试在Mac/iOS上使用tcmalloc库

    概述        TCMalloc 是 Google 开发的内存分配器,在不少项目中都有使用,例如在 Golang 中就使用了类似的算法进行内存分配.它具有现代化内存分配器的基本特征:对抗内存碎片. ...

  3. angular6 监听url查询参数变化刷新页面

    快照snapshot取到的参数是组件第一次渲染时候的参数,当我们在页面中需要根据不同的url查询参数显示不同的内容时,快照就不能满足我们的需要了,这时候就要用ActivatedRoute服务的quer ...

  4. httprunner学习25-文件上传multipart/form-data

    前言 httprunner上传文件接口,其实跟requests上传文件的接口是一样的,之前在python接口系列里面有案例 python接口自动化16-multipart/form-data上传图片 ...

  5. Java多线程编程核心技术-第5章-定时器 Timer-读书笔记

    第 5 章 定时器 Timer 定时 / 计划功能在移动开发领域使用较多,比如 Android 技术.定时计划任务功能在 Java 中主要使用的就是 Timer 对象,他在内部使用多线程的方式进行处理 ...

  6. 小学四则运算口算练习app---No.3

    今天主要是实现按照指定的题目出题数目出题.在昨天设置页面的基础上,今天首先要学习的是接收不同页面间的参数问题.详解如下: 然后就开始我的传参和接收参数的问题! 在当前的Activity上进行跳转, 代 ...

  7. Scrapy笔记08- 文件与图片

    Scrapy笔记08- 文件与图片 Scrapy为我们提供了可重用的item pipelines为某个特定的Item去下载文件. 通常来说你会选择使用Files Pipeline或Images Pip ...

  8. Pandas | 26 疏离数据

    当任何匹配特定值的数据(NaN/缺失值,尽管可以选择任何值)被省略时,稀疏对象被“压缩”. 一个特殊的SparseIndex对象跟踪数据被“稀疏”的地方. 这将在一个例子中更有意义. 所有的标准Pan ...

  9. CLR Exception 0xE0434F4D和0xE0434352的区别

    <根据<CLR Exception---E0434352>和<CLR Exception---E0434F4D>这两篇随笔,我们会发现,这两个异常太相似了,除了代码值不一 ...

  10. Vue 分页功能伪代码实现

    Vue分页功能的实现 其实分页功能是一个比较简单的demo 后端写好pageNum和pageSize的接口直接传参就是了 // 这里我们假设后端已经写好了 pageNum和pagesize <v ...