首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >grpc c++ `grpc_prefork()`是什么?

grpc c++ `grpc_prefork()`是什么?
EN

Stack Overflow用户
提问于 2022-10-01 09:37:15
回答 1查看 195关注 0票数 1

grpc_prefork()的文档中,它被写成

代码语言:javascript
复制
gRPC applications should call this before calling fork(). 
There should be no active gRPC function calls between calling
grpc_prefork() and grpc_postfork_parent()/grpc_postfork_child().

  • 这个函数是做什么的?为什么需要它?

  • ,什么是grpc函数调用?如果我有一个实现某些服务的服务器,并且该服务的方法被调用而没有完成,这是一个grpc函数调用吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-04 21:14:54

首先,这个函数是gRPC Core的一部分,而不是gRPC C++。这是一个为gRPC开发新语言绑定的API,例如Rust、Haskell。如果您只是在使用C++,那么grpc_prefork函数就不适用于您,您可以停止阅读。

grpc_prefork是我们如何处理threads and the fork syscall do not work well together这个事实的。当线程调用叉时,只将该单个线程复制到子线程中。在子进程中,似乎父进程中的所有其他线程都消失了,不管它们在做什么。有些人可能持有一个互斥锁,平衡线程之间共享的树。有些人可能是在做I/O,因此,儿童进程中的状态是一个被违反的假设的雷区。

我喜欢用世界上其他人的比喻,但你突然消失了。可能会有一段时间是和平的,但很快飞机就会从空中坠落,核反应堆也会开始融化。

grpc_prefork是解决这个问题的方法。它打算在pthread_atfork注册。当线程(线程A)调用fork时,它将首先运行grpc_prefork。这会向进程中的所有其他线程发出一些信号,这些线程需要关闭所有FDs并进入已知的安全状态(即不保存任何互斥或主动修改任何数据结构)。线程A将阻塞等待所有其他线程到达安全状态。

在此之后,在父中调用grpc_postfork_parent,在子中调用grpc_postfork_child。可以说,这会让飞机重返空中,核电站的工作人员重新开始工作。

什么是grpc函数调用

这意味着任何gRPC核心API。他们中没有多少人被封锁了,所以这不是什么大问题。我们在这里担心的主要阻塞功能是grpc_completion_queue_next,它驱动了gRPC内核中的大部分工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73917256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档