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异步处理应答的更多相关文章
- gRPC官方文档(异步基础: C++)
文章来自gRPC 官方文档中文版 异步基础: C++ 本教程介绍如何使用 C++ 的 gRPC 异步/非阻塞 API 去实现简单的服务器和客户端.假设你已经熟悉实现同步 gRPC 代码,如gRPC 基 ...
- grpc使用记录(三)简单异步服务实例
目录 grpc使用记录(三)简单异步服务实例 1.编写proto文件,定义服务 2.编译proto文件,生成代码 3.编写服务端代码 async_service.cpp async_service2. ...
- 【gRPC】C++异步服务端客户端API实例及代码解析
对于同步API而言,程序的吞吐量并不高.因为在每次发送一个gRPC请求时,会阻塞整个线程,必须等待服务端的ack回到客户端才能继续运行或者发送下一个请求,因此异步API是提升程序吞吐量的必要手段. g ...
- HTTP之gRPC
gRPC 官方文档 gRPC 是一个高性能.开源和通用的 RPC 框架,面向移动和 HTTP/2 设计. gRPC 基于 HTTP/2 标准设计,带来诸如双向流.流控.头部压缩.单 TCP 连接上的多 ...
- 开始食用grpc(之二)
开始食用grpc(之二) 转载请注明出处:https://www.cnblogs.com/funnyzpc/p/9570992.html ``` 前段时间有童鞋找我开专栏.搬家.甚至还有人找我写书的. ...
- GRPC单向/双向流
开始食用grpc(之二)https://www.cnblogs.com/funnyzpc/p/9570992.html 开始食用grpc(之一)https://www.cnblogs.com/funn ...
- gRPC官方文档(通讯协议)
文章来自gRPC 官方文档中文版 HTTP2 协议上的 gRPC 本文档作为 gRPC 在 HTTP2 草案17框架上的实现的详细描述,假设你已经熟悉 HTTP2 的规范.产品规则采用的是ABNF 语 ...
- Netty服务端与客户端(源码一)
首先,整理NIO进行服务端开发的步骤: (1)创建ServerSocketChannel,配置它为非阻塞模式. (2)绑定监听,配置TCP参数,backlog的大小. (3)创建一个独立的I/O线程, ...
- Netty 入门示例
服务端代码示例 import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.*; import io.netty.channe ...
随机推荐
- Browsing contexts 浏览器上下文
浏览上下文就是document object 呈现给用户的所在的环境 每一个标签或者窗口都包含一个浏览器上下文,包括iframe frames 每一个browsing context ...
- G彩娱乐网【分享】想要开源自己的代码可以参考一下
作为一个开发者,如果你打算开源自己的代码,千万不要忘记,选择一种开源许可证(license). 许多开发者对开源许可证了解很少,不清楚有哪些许可证,应该怎么选择.本文介绍开源许可证的基本知识,主要参考 ...
- 双11Java程序员书单推荐
Java <Java核心技术卷I> <Java核心技术卷II> <Java编程思想> <Java并发编程实战> <Effective Java&g ...
- python3 selenium模拟登陆斗鱼提取数据保存数据库
# coding=utf-8from selenium import webdriverimport jsonimport timeimport pymongo class Douyu: def __ ...
- hash算法与hashmap
参考博客: http://zha-zi.iteye.com/blog/1124484 http://www.cnblogs.com/dolphin0520/p/3681042.html(参考了hash ...
- Spring Boot单元测试(Mock)
Spring Boot单元测试(Mock) Java个人学习心得 2017-08-12 16:07 Mock 单元测试的重要性就不多说了,我这边的工程一般都是Spring Boot+Mybatis(详 ...
- python20171113笔记
问题一: python {File "<stdin>", line 1} error 解决方法:就是不用先输入 python进入python解释器,而直接输入pytho ...
- 【OpenCV】一种基于阈值的图片中的文字分割
在今年泰迪杯A题电商中图片的文字识别这道题中,我们先用了一种很笨的办法来分割字符. 首先对图片进行灰度化,然后二值化,这里的二值化要选择一个合适的阈值.然后我们进行轮廓的提取,计算轮廓最小矩形的面积, ...
- CLR类型设计之泛型(二)
在上一篇文章中,介绍了什么是泛型,以及泛型和非泛型的区别,这篇文章主要讲一些泛型的高级用法,泛型方法,泛型接口和泛型委托,协变和逆变泛型类型参数和约束性,泛型的高级用法在平时的业务中用的不多,多用于封 ...
- 工作中用到的一些shell命令
1.将十进制转换为十六进制 for i in `seq 0 127`; do printf "%02x\n" $i; done