异步基础: C++

gRPC 的异步操作使用。 基本工作流如下:

  • 做一些事情如读取或者写入,以唯一的 voide* 标签展示
  • 调用 CompletionQueue::Next 去等待操作结束。如果标签出现,表示对应的操作已经完成。

要使用一个异步的客户端调用远程方法,你首先得创建一个频道和存根,如你在同步客户端中所作的那样。一旦有了存根,你就可以通过下面的方式来做异步调用:

  • 用一个唯一的标签,寻求回答和最终的状态

    Status status;
    rpc->Finish(&reply, &status, (void*)1);

  • 等待完成队列返回下一个标签。当标签被传入对应的 Finish() 调用时,回答和状态就可以被返回了。


你可以在这里看到完整的客户端例子。

服务器实现请求一个带有标签的 RPC 调用,然后等待完成队列返回标签。异步处理 RPC 的基本工作流如下:

  • 请求一个 RPC 提供唯一的标签

    ServerContext context;
    HelloRequest request;
    ServerAsyncResponseWriter responder;
    service.RequestSayHello(&context, &request, &responder, &cq, &cq, (void*)1);

  • 等待完成队列返回标签。当取到标签时,上下文,请求和应答器都已经准备就绪。


然而,这个基本的工作流没有考虑服务器并发处理多个请求。要解决这个问题,我们的完成异步服务器例子使用了 对象去维护每个 RPC 的状态,并且使用这个对象的地址作为调用的唯一标签。

简单起见,服务器对于所有的事件只使用了一个完成队列,并且在 中运行了一个主循环去查询队列:

你可以在greeter_async_server.cc看到完整的服务器例子。

原文: