c++ - gRPC:在 C++ 中关闭异步服务器的推荐方法是什么?

标签 c++ asynchronous server grpc shutdown

我有一个托管两个异步服务(“Master”和“Worker”)的 gRPC 服务器,我想为服务器实现正常关闭。每个服务都有自己的 grpc::CompletionQueue

似乎有两个可能相关的 Shutdown() 方法:grpc::CompletionQueue::Shutdown()grpc::Server::Shutdown() ,但从文档中不清楚应该使用哪些。

什么是关闭异步服务的好模式?

最佳答案

TL;DR:您必须同时调用 grpc::Server::Shutdown()grpc::CompletionQueue::Shutdown() (对于服务中使用的每个完成队列)干净地关闭。

  1. 如果您调用 cq_->Shutdown() ,唯一可观察到的影响是对 Service::AsyncService::RequestFoo() (相应 Foo RPC 的生成方法)的后续调用失败并带有断言。从阅读相应 C API 方法 (grpc_completion_queue_shutdown()) 的文档来看,将新工作添加到队列中似乎是非法的——即通过调用 RequestFoo()——所以我向我的服务包装类(受互斥体保护)添加了一个 is_shutdown_ 成员,这样在 cq_->Shutdown() 被调用。然而,在这样做之后,完成队列在 cq_->Next() 中无限期地阻塞。 .所有入队的标签都不完整(有错误或其他原因)。

  2. 如果您改为调用 server_->Shutdown() ,所有排队的标签都会立即完成(使用 ok == false)。但是,完成队列在 cq_->Next() 中继续无限期阻塞。

同时调用 cq_->Shutdown()(对于每个定义的完成队列)和 server_->Shutdown() 会导致完全关闭。

一个警告:如果你使用 grpc::ServerContext::AsyncNotifyWhenDone() 注册一个取消调用的标签,这些将不会cq_ 返回->Next() 如果服务器在收到该调用的初始请求之前关闭。如果要避免内存泄漏,则需要谨慎处理相应标记结构的内存管理。

关于c++ - gRPC:在 C++ 中关闭异步服务器的推荐方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35708348/

相关文章:

c++ - 在 C 中使用指向对象的指针的方法

c++ - 嵌套成员类型识别

server - 本地网络上的树莓派访问服务器

c++ - 将二进制转换为负整数

c# - Async-Await 在预期死锁的地方没有死锁

gwt - 从 GWT 客户端进行跨站点异步 HTTP 发布

c# - Async MethodInfo Invoke - 动态转换返回类型

r - 如何简单地将变量从服务器传递到 UI?

node.js - 如何在端口 80 上部署第二台服务器(听 EADDRINUSE:::80)

c++ - boost .MultiIndex : How to make an effective set intersection?