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. C++实现grpc异步服务器

    首先可以跑一下grpc官方的例子,网址: https://grpc.io/docs/languages/cpp/quickstart/ 一.下载grpc包并编译 https://github.com/ ...

  2. qt 背景和控件布局_QT 设计师使用样式表添加背景

    QT create中样式表可以用来设置背景图.背景颜色.字体大小格式颜色等 1.添加背景图的话需要先添加资源文件 右击项目文件选择添加新文件,再选择QT资源文件(QT resource file)然后 ...

  3. BIO、伪异步 IO、AIO和NIO

    BIO 采用 BIO 通信模型的服务端, 通常由一个独立的 Acceptor 线程负责监听客户端的连接, 它接收到客户端连接请求之后为每个客户端创建一个新的线程进行链路处理, 处理完成之后, 通过输出 ...

  4. 分布式RPC框架dubbo、motan、rpcx、gRPC、thrift简介与性能比较

    分布式RPC框架性能大比拼 dubbo.motan.rpcx.gRPC.thrift的性能比较  Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现 ...

  5. 微服务等于Spring Cloud?了解微服务架构和框架

    作者:TIM XU 来源:https://xiaoxubeii.github.io/articles/microservices-architecture-introduction/ 微服务初探 什么 ...

  6. 一篇文章带你快速理解微服务架构,由浅入深带你走进微服务架构的核心

    戳蓝字"CSDN云计算"关注我们哦! 文章来自:Java和Android架构 什么是微服务 首先微服务并没有一个官方的定义,想要直接描述微服务比较困难,我们可以通过对比传统WEB应 ...

  7. 微服务等于Spring Cloud?一文告诉你微服务到底是什么

    作者:TIM XU 原文:https://xiaoxubeii.github.io/articles/microservices-architecture-introduction/ 1 微服务初探 ...

  8. 微服务等于 Spring Cloud?了解微服务架构和框架

    点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 8:55 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | J ...

  9. 云计算与云原生 — 云原生微服务架构的技术内涵

    目录 文章目录 目录 微服务框架的演进 第一代微服务框架 Spring Cloud Dubbo 下一代微服务框架 - Service Mesh Istio Envoy Kubernetes + Ser ...

最新文章

  1. Intel发布FPGA
  2. Facebook成立AI语言研究联盟,自然语言处理或有新成果
  3. TechED2010与我(一)—— 初来乍到
  4. redis 分页_Redis排行榜的设计与实现
  5. 电脑Win10系统如何进入安全模式
  6. qt通过http连接mysql_Qt如何利用MySQL连接远程数据库?
  7. 使用Struts2框架开发租房系统(8)
  8. javaee字符缓冲输出流
  9. TRC文件转ASC文件
  10. 全球新冠疫情可视化图表制作
  11. CSS学习笔记——动画进阶(八音盒动画效果)
  12. SWFAddress实现Flex深度链接(不同模块具有不同的URL)
  13. 201771010101 白玛次仁 《2018面向对象程序设计(Java)》第九周学习总结
  14. 【ArnoldC4D】6.ArnoldToC4D_光泽和反射光线深度(glossy_and_reflection)
  15. 1D卷积网络HAR(人体活动识别)实践
  16. 《佛密诸事》第七章:释逸牟尼四十九禅修录(节录十日)
  17. 粗读MD-UNET: Multi-input dilated U-shape neural network for segmentation of bladder cancer
  18. saber框架 blade-core-tool:2.5.1 maven无法正常下载
  19. Ubuntu 1804 升级内核
  20. Kotlin contract 用法及原理

热门文章

  1. android捕获方法,android捕获Home键的方法
  2. 纯html css博客,纯HTML+CSS打造动画
  3. xampp python linux,Ubuntu的XAMPP着运行python脚本
  4. mysql 常见存储过程,MYSQL存储过程
  5. 2021年春季学期-信号与系统-第八次作业参考答案-第三小题
  6. CSDN 的文化衫寄送到啦
  7. 航天智慧物流线上预选赛-成绩公布
  8. 2021年春季学期-信号与系统-第二次作业参考答案-第八小题
  9. 两款扁平步进电机及其驱动器VSMD102
  10. NS4146 D类音频放大电路