代码之家  ›  专栏  ›  技术社区  ›  Elad Maimoni

如果流媒体从未启动,如何取消服务器端流媒体请求?

  •  0
  • Elad Maimoni  · 技术社区  · 3 年前

    当使用grpc异步接口时,服务器端流包括服务器端代码上的3个主要步骤:

    1. 请求-服务器开始侦听客户端对流的请求。
    2. 写入-一旦从完成队列返回与步骤1相关的标记,服务器就可以通过 ServerAsyncWriter::Write
    3. 一旦服务器完成流,它调用 ServerAsyncWriter::Finish

    如果我想从服务器端取消RPC,理论上我可以通过 grpc::ServerContext::TryCancel 。 然而,呼叫 TryCancel 只有在阶段1完成之后才可能。例如,如果客户端从未要求启动流,则步骤1永远不会完成。在这种情况下,除了关闭整个服务器外,无法取消请求。

    我试着打电话 grpc::ServerContext::TryCancel 甚至在流传输开始之前,它就导致了访问违规。

    那么,在这种情况下,我如何从服务器端取消RPC呢?

    0 回复  |  直到 3 年前
        1
  •  0
  •   Esun Kim    3 年前

    你无法获得 grpc::ServerContext 例如在步骤2之前。看来你用错了 grpc::ServerContext 例如。gRPC没有办法撤消第一步。(我在这里使用undo是因为 cancel gRPC中的谓词只有在有相应请求时才有意义)如果需要,可以关闭服务器以撤消此操作。