gRPC异步处理应答

(金庆的专栏)

gRPC的演示样例 greeter_async_client.cc 不算是异步客户端,
它使用了异步请求。可是堵塞式等待应答,结果成为一个同步调用。

std::string SayHello(const std::string& user) {
    ...
    std::unique_ptr<ClientAsyncResponseReader<HelloReply> > rpc(
        stub_->AsyncSayHello(&context, request, &cq));
    rpc->Finish(&reply, &status, (void*)1);
    void* got_tag;
    bool ok = false;
    // Block until the next result is available in the completion queue "cq".
    cq.Next(&got_tag, &ok);

...
    return reply.message();
  }

为了实现真正的异步RPC请求。发出请求后马上返回,然后在一个线程中处理全部应答。

下面代码经測试表明能够使用。

// Grpc异步应答处理。线程中执行.
void HandleGrpcResponses()
{
    ...
    grpc::CompletionQueue & rCq = rMgr.GetCq();
    for (;;)
    {
        void * pTag;
        bool ok = false;
        // Block until the next result is available in the completion queue "cq".
        rCq.Next(&pTag, &ok);

// Act upon the status of the actual RPC.
        std::unique_ptr<IGrpcCb> pCb(static_cast<IGrpcCb*>(pTag));
        const grpc::Status & rStatus = pCb->GetStatus();
        if (rStatus.ok())
            (*pCb)();  // run callback
    }
}

IGrpcCb是回调类。定义例如以下:

class IGrpcCb
{
public:
    explicit IGrpcCb(...) {};
    virtual ~IGrpcCb(void) {};

grpc::ClientContext & GetContext() { return m_context; }
    grpc::Status & GetStatus() { return m_status; }

public:
    virtual void operator()() {};

protected:
    grpc::ClientContext m_context;
    grpc::Status m_status;
    ...
};

// R is response class like rpc::CreateRoomResponse.
template <class R>
class GrpcCb final : public IGrpcCb
{
public:
    explicit GrpcCb(...)
        : IGrpcCb(...)
        {};
    virtual ~GrpcCb(void) override {};

public:
    typedef std::unique_ptr<grpc::ClientAsyncResponseReader<R> > RpcPtr;

public:
    R & GetResp() { return m_resp; }
    void SetRpcPtrAndFinish(RpcPtr pRpc)
    {
        m_pRpc.swap(pRpc);
        m_pRpc->Finish(&m_resp, &m_status, (void*)this);
    }

public:
    virtual void operator()() override
    {
        // Deal m_resp...
    }

private:
    RpcPtr m_pRpc;
    R m_resp;
};

异步请求代码示比例如以下:

grpc::CompletionQueue & cq = GetCq();
        rpc::CreateRoomRequest req;

// pGcb will be deleted in HandleGrpcResponses().
        auto pGcb = new GrpcCb<rpc::CreateRoomResponse>(...);
        pGcb->SetRpcPtrAndFinish(
            m_pStub->AsyncCreateRoom(&pGcb->GetContext(), req, &cq));

gRPC异步处理应答的更多相关文章

  1. gRPC官方文档(异步基础: C++)

    文章来自gRPC 官方文档中文版 异步基础: C++ 本教程介绍如何使用 C++ 的 gRPC 异步/非阻塞 API 去实现简单的服务器和客户端.假设你已经熟悉实现同步 gRPC 代码,如gRPC 基 ...

  2. grpc使用记录(三)简单异步服务实例

    目录 grpc使用记录(三)简单异步服务实例 1.编写proto文件,定义服务 2.编译proto文件,生成代码 3.编写服务端代码 async_service.cpp async_service2. ...

  3. 【gRPC】C++异步服务端客户端API实例及代码解析

    对于同步API而言,程序的吞吐量并不高.因为在每次发送一个gRPC请求时,会阻塞整个线程,必须等待服务端的ack回到客户端才能继续运行或者发送下一个请求,因此异步API是提升程序吞吐量的必要手段. g ...

  4. HTTP之gRPC

    gRPC 官方文档 gRPC 是一个高性能.开源和通用的 RPC 框架,面向移动和 HTTP/2 设计. gRPC 基于 HTTP/2 标准设计,带来诸如双向流.流控.头部压缩.单 TCP 连接上的多 ...

  5. 开始食用grpc(之二)

    开始食用grpc(之二) 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9570992.html ``` 前段时间有童鞋找我开专栏.搬家.甚至还有人找我写书的. ...

  6. GRPC单向/双向流

    开始食用grpc(之二)https://www.cnblogs.com/funnyzpc/p/9570992.html 开始食用grpc(之一)https://www.cnblogs.com/funn ...

  7. gRPC官方文档(通讯协议)

    文章来自gRPC 官方文档中文版 HTTP2 协议上的 gRPC 本文档作为 gRPC 在 HTTP2 草案17框架上的实现的详细描述,假设你已经熟悉 HTTP2 的规范.产品规则采用的是ABNF 语 ...

  8. Netty服务端与客户端(源码一)

    首先,整理NIO进行服务端开发的步骤: (1)创建ServerSocketChannel,配置它为非阻塞模式. (2)绑定监听,配置TCP参数,backlog的大小. (3)创建一个独立的I/O线程, ...

  9. Netty 入门示例

    服务端代码示例 import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channe ...

随机推荐

  1. [java基础] java 左移和右移

    今天搜到一个比较好用的在线编译器,希望和大家分享. 除了java还有c++....,地址是http://www.tutorialspoint.com/compile_java_online.php 另 ...

  2. Linux系列教程(十六)——Linux权限管理之ACL权限

    通过前面的两篇博客我们介绍了Linux系统的用户管理,Linux用户和用户组管理之相关配置文件 讲解了用户管理的相关配置文件,包括用户信息文件/etc/passwd,用户密码文件/etc/shadow ...

  3. 强大又简单的响应式框架——Foundation 网格系统

          前端框架——Foundation     简介 Foundation 用于开发响应式的 HTML, CSS and JavaScript 框架. Foundation 是一个易用.强大而且 ...

  4. JavaScript面向对象(收集整理)

    (1)封装 首先理解构造函数:所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量.对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上. f ...

  5. WPF 简易的喷泉效果

    这两天领导让我做个喷泉的效果,要把一个个UserControl从一个位置喷出,然后,最后落在最终需要在的位置. 喷泉效果说白了,就是两个步骤:1.放大,从0放大到需要的倍数:2.缩小,平移,从放大的倍 ...

  6. Centos6上进行Mysql5.6安装和主从复制部署

    系统:centos6 数据库:mysql5.6 服务器:两台,一主一从 一.Mysql5.6二进制版本的安装 Mysql的安装在有三种模式,第一种是yum安装,第二种是二进制模式的安装,第三种是源码编 ...

  7. 采用Vue2.0开发的分页js组件

    2017-11-17 19:14:23 基于jQuery的分页插件相信大家伙已经都用过很多了,今天分享一下基于Vue2.0的分页插件pagination.js 由于项目需求,要求使用 Vue2.0 开 ...

  8. [转载] Redis集群搭建最佳实践

    转载自http://blog.csdn.net/sweetvvck/article/details/38315149?utm_source=tuicool 要搭建Redis集群,首先得考虑下面的几个问 ...

  9. ASP.NET Core教程【一】关于Razor Page的知识

    关键文件和目录结构 按照asp.net core WEB应用程序向导,创建一个工程之后 你会发现如下几个目录和文件 wwwroot:放置网站的静态文件的目录 Pages:放置razor页面的目录 ap ...

  10. 老男孩Python全栈开发(92天全)视频教程 自学笔记02

    day2课程目录: 操作系统的历史 二进制运算 字符编码与计算机容量 编程语言介绍 开发语言分类 演讲能力锻炼 day2课程内容梳理: 操作系统发展史: Unix系统 极其稳定 现在很多银行还在用 L ...