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()(对于服务中使用的每个完成队列)才能彻底关闭。

  1. 如果你打电话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 个入队标签已完成(有错误或其他原因)。

  2. 如果您改为调用 server_->Shutdown(),则所有排队的标签会立即完成(使用 ok == false)。但是,完成队列在 cq_->Next().

  3. 中继续无限期阻塞

同时调用 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