在grpc_prefork()的文档中,它被写成
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().,
发布于 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内核中的大部分工作。
https://stackoverflow.com/questions/73917256
复制相似问题