当前位置:网站首页>gRPC基础概念:闭包
gRPC基础概念:闭包
2022-08-11 01:44:00 【real沛林】
闭包定义
closure就是闭包的英文名称.
简单的理解,闭包函数将创建闭包时的上下文中的变量与自己绑定在一起,将变量的生存期和作用域延长到闭包函数结束。
概念有点儿抽象,下面是python中一个闭包的例子:
def add_n(n):
def real_add(m):
nonlocal n
n+=1
return n + m
return real_add
f = add_n(10)
print(f(5)) //输出16
print(f(5)) //输出17
为什么需要闭包
闭包有什么好处呢?
通过上面的例子,我们可以看到创建闭包时将变量与其绑定,在闭包实际运行时再使用它。
这样能够方便地在创建闭包时即将当前上下文中的变量传递给它,因为在运行闭包时并不容易再得到这个变量。
这个特性十分有利于在gRPC中方便的编写异步代码。
为了方便地使用闭包,gRPC提供了下面4个宏:
GRPC_CLOSURE_CREATE(cb, cb_arg, scheduler):创建一个闭包,返回创建后的闭包。参数分别为:回调函数,参数,调度器
GRPC_CLOSURE_INIT(closure, cb, cb_arg, scheduler):初始化一个闭包,第一个参数为要初始化的闭包。后面3个参数同上
GRPC_CLOSURE_RUN(closure, error):立即运行一个闭包,并传递错误状态.
GRPC_CLOSURE_SCHED(closure, error):调度一个闭包,并传递错误状态。
可以看出,创建闭包时将当前上下文的参数cb_arg传递给闭包对象保存,实际运行闭包时闭包就会使用这个创建时的参数。
上面提到的调度器在下文会详细介绍。
运行(GRPC_CLOSURE_RUN)和调度闭包(GRPC_CLOSURE_SCHED)的区别是:运行闭包立即运行。调度闭包是在指定的调度器上运行闭包,运行上下文可能是当前线程,也可能是另外的线程。
最后看gRPC源码中一个实际使用闭包的例子:
创建闭包
tcp_server_start()
{
...
grpc_tcp_listener* sp;
...
GRPC_CLOSURE_INIT(&sp->read_closure, on_read, sp,
grpc_schedule_on_exec_ctx);
}
在启动tcp监听时,创建一个read_closure闭包,并将当前的监听者信息绑定到闭包上。
运行闭包
当epoll循环监听到有连接接入时,会实际运行闭包.
fd_become_readable(fd, pollset)----> fd->read_closure->SetReady()---->GRPC_CLOSURE_SCHED((grpc_closure*)curr, GRPC_ERROR_NONE);
这时候就会实际调用on_read函数
static void on_read(void* arg, grpc_error* err) {
grpc_tcp_listener* sp = static_cast<grpc_tcp_listener*>(arg);
}
on_read函数这时就能够使用创建时绑定的sp变量了.
原文链接:https://blog.csdn.net/happyAnger6/article/details/102750612
边栏推荐
- Is container technology really the savior of environmental management?
- #yyds Dry Goods Inventory#[Yugong Series] August 2022 Go Teaching Course 008-Integer of Data Types
- paddle2.3和torch1.8在SentenceBert上的性能对比
- 备战“金九银十”,软件测试功能 / 数据库 /linux/ 接口 / 自动化 / 测试开发面试真题解析
- 【websocket】
- How to convert url to obj or obj to url
- 【C 数据存储详解】(1)——深度剖析整形数据在内存中的存储
- C # - delegate detailed usage
- 研发项目流程规范
- 如何实现FPGA的可重复性设计
猜你喜欢
络达开发---串口日志&日志过滤
QT+VTK+PCL拟合圆柱并计算起始点、中止点
Dual machine thermal for comprehensive experiment (VRRP + OSPF + + NAT + DHCP + VTP PVSTP + single-arm routing)
阿里亿级并发册 + 机器学习算法 + 面试册 + 优化册 + 代码册 笔记!!!
通过微透镜阵列的传播
Please talk about for...in and for...of in JS (below)
OptiFDTD应用:用于光纤入波导耦合的硅纳米锥仿真
C # - delegate detailed usage
络达开发---自定义BLE服务(二):功能实现
2022年PMP报考指南
随机推荐
英伟达 GPU 架构简史
22. Inventory service
dump_stack ()
划分字母区间[贪心->空间换时间->数组hash优化]
报错处理:org.xml.sax.SAXParseException: 不允许有匹配 “[xX][mM][lL]“ 的处理指令目标
联盛德W801系列6-从微信小程序的角度来分析W801的蓝牙通信源码(indicate方式)
【websocket】
软件测试面试题:I P协议、RARP协议、ICMP协议与ARP协议的功能是什么?
软件测试面试题:测试用例与测试脚本?
0图中等 LeetCode565. 数组嵌套
阿里亿级并发册 + 机器学习算法 + 面试册 + 优化册 + 代码册 笔记!!!
#yyds Dry Goods Inventory#[Yugong Series] August 2022 Go Teaching Course 008-Integer of Data Types
两日总结九
Deep Learning [Chapter 2]
13.cuBLAS开发指南中文版--cuBLAS中的Level-1函数copy()和dot()
php 判断数组是否为多维数组
How to create an index when sql uses where and groupby?
The statistical data analysis, interview manual"
Data Analysis Interview Manual "SQL"
Sigma development pays attention to details