C++ gRPC:在C++;?
我有一个gRPC服务器,它承载两个异步服务(“主”和“工作”),我想实现服务器的正常关闭。每个服务都有自己的C++ gRPC:在C++;?,c++,asynchronous,server,grpc,shutdown,C++,Asynchronous,Server,Grpc,Shutdown,我有一个gRPC服务器,它承载两个异步服务(“主”和“工作”),我想实现服务器的正常关闭。每个服务都有自己的grpc::CompletionQueue 似乎有两种Shutdown() 关闭异步服务的好模式是什么;DR:您必须同时调用and(对于服务中使用的每个完成队列)以完全关闭 如果调用,唯一可以观察到的效果是对Service::AsyncService::RequestFoo()(相应FooRPC的生成方法)的后续调用会因断言而失败。通过阅读相应的C API方法()的文档,似乎向队列中添加新
grpc::CompletionQueue
似乎有两种Shutdown()
关闭异步服务的好模式是什么;DR:您必须同时调用and(对于服务中使用的每个完成队列)以完全关闭
如果调用,唯一可以观察到的效果是对Service::AsyncService::RequestFoo()
(相应Foo
RPC的生成方法)的后续调用会因断言而失败。通过阅读相应的C API方法()的文档,似乎向队列中添加新工作是非法的——即通过调用RequestFoo()
——因此我在我的服务包装类中添加了is\u shutdown\u
成员(受互斥锁保护),以便在cq\uq->shutdown()之后不会进行排队尝试
被调用。但是,执行此操作后,完成队列将无限期地阻塞。所有排队的标记均未完成(出现错误或其他)
如果改为调用,则所有排队的标记立即完成(使用ok==false
)。但是,完成队列继续在cq\uz->Next()
中无限期地阻塞
调用cq->Shutdown()
(对于每个定义的完成队列)和server->Shutdown()
会导致完全关闭
一个警告:如果使用grpc::ServerContext::AsyncNotifyWhenDone()
注册用于取消呼叫的标记,则如果服务器在收到该呼叫的初始请求之前关闭,则cq\uz->Next()
不会返回这些标记。如果您想避免内存泄漏,则需要小心相应标记结构的内存管理。
- 等等
void grpc::Server::Wait()
超越虚拟
阻止,直到服务器关闭
警告
服务器必须关闭,或者其他线程必须调用Shutdown才能返回此函数
- grpc::服务器关闭()
很好的自我回答!几张便条。第一:根据,必须在完成队列(或多个队列)之前关闭服务器。第二:事实上,AsyncNotifyWhenDone()
没有通过cq\uz->Next()
返回,这可能就是它暗地里说的“AsyncNotifyWhenDone:ok应该始终为真”的意思。它还说,对于客户端完成,所以可能在关机期间也不会返回该完成的标记。