C++ gRPC:在C++;?

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服务器,它承载两个异步服务(“主”和“工作”),我想实现服务器的正常关闭。每个服务都有自己的
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应该始终为真”的意思。它还说,对于客户端完成,所以可能在关机期间也不会返回该完成的标记。