gRPC:在 C++ 中关闭异步服务器的推荐方法是什么?
gRPC: What is the recommended way to shut down an asynchronous server in C++?
我有一个托管两个异步服务("Master" 和 "Worker")的 gRPC 服务器,我想为服务器实现正常关闭。每个服务都有自己的 grpc::CompletionQueue
.
似乎有两种 Shutdown()
方法可能相关:grpc::CompletionQueue::Shutdown()
and grpc::Server::Shutdown()
,但文档中并不清楚应使用哪种方法。
关闭异步服务的良好模式是什么?
TL;DR: 您必须调用两者 grpc::Server::Shutdown()
and grpc::CompletionQueue::Shutdown()
(对于服务中使用的每个完成队列)才能彻底关闭。
如果你打电话cq_->Shutdown()
, the only observable effect is that subsequent calls to Service::AsyncService::RequestFoo()
(the generated method for the corresponding Foo
RPC) fail with an assertion. From reading the documentation of the corresponding C API method (grpc_completion_queue_shutdown()
), it appears that it is illegal to add new work to the queue—i.e. by calling RequestFoo()
—so I added an is_shutdown_
member to my service wrapper classes (protected by a mutex) so that no enqueue attempts are made after cq_->Shutdown()
is called. However, after doing this, the completion queue blocks indefinitely in cq_->Next()
。 None 个入队标签已完成(有错误或其他原因)。
如果您改为调用 server_->Shutdown()
,则所有排队的标签会立即完成(使用 ok == false
)。但是,完成队列在 cq_->Next()
.
中继续无限期阻塞
同时调用 cq_->Shutdown()
(针对每个定义的完成队列)和 server_->Shutdown()
会导致干净关闭。
一个警告:如果您使用 grpc::ServerContext::AsyncNotifyWhenDone()
注册呼叫取消标签,这些将 不会 在服务器关闭时由 cq_->Next()
返回在收到该呼叫的初始请求之前。如果要避免内存泄漏,则需要谨慎处理相应标签结构的内存管理。
- 等等()
void grpc::Server::Wait ()
覆盖虚拟
阻塞直到服务器关闭。
警告
服务器必须正在关闭,或者某些其他线程必须为此函数调用 Shutdown return。
- grpc::服务器关闭()
http://static.grumpycoder.net/pixel/ref/c++/html/classgrpc_1_1_server.html
我有一个托管两个异步服务("Master" 和 "Worker")的 gRPC 服务器,我想为服务器实现正常关闭。每个服务都有自己的 grpc::CompletionQueue
.
似乎有两种 Shutdown()
方法可能相关:grpc::CompletionQueue::Shutdown()
and grpc::Server::Shutdown()
,但文档中并不清楚应使用哪种方法。
关闭异步服务的良好模式是什么?
TL;DR: 您必须调用两者 grpc::Server::Shutdown()
and grpc::CompletionQueue::Shutdown()
(对于服务中使用的每个完成队列)才能彻底关闭。
如果你打电话
cq_->Shutdown()
, the only observable effect is that subsequent calls toService::AsyncService::RequestFoo()
(the generated method for the correspondingFoo
RPC) fail with an assertion. From reading the documentation of the corresponding C API method (grpc_completion_queue_shutdown()
), it appears that it is illegal to add new work to the queue—i.e. by callingRequestFoo()
—so I added anis_shutdown_
member to my service wrapper classes (protected by a mutex) so that no enqueue attempts are made aftercq_->Shutdown()
is called. However, after doing this, the completion queue blocks indefinitely incq_->Next()
。 None 个入队标签已完成(有错误或其他原因)。如果您改为调用
server_->Shutdown()
,则所有排队的标签会立即完成(使用ok == false
)。但是,完成队列在cq_->Next()
. 中继续无限期阻塞
同时调用 cq_->Shutdown()
(针对每个定义的完成队列)和 server_->Shutdown()
会导致干净关闭。
一个警告:如果您使用 grpc::ServerContext::AsyncNotifyWhenDone()
注册呼叫取消标签,这些将 不会 在服务器关闭时由 cq_->Next()
返回在收到该呼叫的初始请求之前。如果要避免内存泄漏,则需要谨慎处理相应标签结构的内存管理。
- 等等()
void grpc::Server::Wait ()
覆盖虚拟 阻塞直到服务器关闭。
警告 服务器必须正在关闭,或者某些其他线程必须为此函数调用 Shutdown return。
- grpc::服务器关闭()
http://static.grumpycoder.net/pixel/ref/c++/html/classgrpc_1_1_server.html