thrift异步调用

thrift异步调用关于异步,我找了很多资料,java方面的比较多,可c的少之又少,很多就是简单提一下,也么说怎么用,最后终于还是自己研究出来了异步分为服务端异步与客户端异步两部分,理论上他们两者是无关的,不论服务端同步与否,客服端都可以做成异步的。客户端异步客户端异步比较简单,服务端可以使用任何server,TThreadPoolServer或TNonblockingServer等随意,客户端不调用自动

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

关于异步,我找了很多资料,java方面的比较多,可c的少之又少,很多就是简单提一下,也么说怎么用,最后终于还是自己研究出来了

异步分为服务端异步与客户端异步两部分,理论上他们两者是无关的,不论服务端同步与否,客服端都可以做成异步的。

客户端异步

客户端异步比较简单,服务端可以使用任何server,TThreadPoolServer或TNonblockingServer等随意,客户端不调用自动生成的函数原型,
改为分别调用分拆开来的send与recv两个即可,例如下面代码:

//函数名为invoke,函数原型为:
string invoke(1:WS_OP_TYPE type, 2:string msg);
//同步调用方式代码为(retstr为返回字符串,另外两个为传入参数):
client.invoke(retstr, WS_OP_TYPE::WS_OP_STORE_DEVICE_ACTION, msgstr);
//异步调用方式代码为:
client.send_invoke(WS_OP_TYPE::WS_OP_STORE_DEVICE_ACTION, msgstr);
client.send_invoke(WS_OP_TYPE::WS_OP_STORE_DEVICE_ACTION, msgstr1);
client.recv_invoke(retstr);
client.recv_invoke(retstr1);

send_invoke即为调用invoke时的发送消息过程
recv_invoke即为调用invoke时的接收消息过程
这两个接口代码会同invoke接口一起生成,我们直接调用即可
通过这样简单的调用即可实现客户端异步,即发送与接收中间可以处理其他业务流程,
也可以像上面代码中使用同一客户端分别发送几次完成后再分别全部接收,框架会分别接收到每一个调用的结果,
到这里就会有一个疑问:同时调用那么多次,如何才能识别返回的消息是那次调用返回呢?
比较简单的做法就是调用过程中加一个序列号的参数,每次调用返回的序列号都相同,而不同次调用的序列号都不同。
thrift也提供了异步客户端的实现,但生成代码时需要添加cob_style属性,即运行以下命令:

thrift --gen cpp:cob_style a.thrift 

生成的代码中包含一个AsynClient的类以供实现异步调用,初步看到是使用回调函数进行的。
此种方法正在研究中,随后会将研究结果补充上来

服务端异步

Thrift服务端异步通过使用TNonblockingServer实现,TNonblockingServer依赖libevent,即编译Thrift时系统必须已经安装libevent,否则编译出的Thrift不包含TNonblockingServer的实现,ubuntu安装libevent使用如下命令:

sudo apt-get install libevent-dev

同时使用TNonblockingServer时,应用程序编译命令也需要添加 -lthriftnb -levent。使用TNonblockingServer的代码如下:

int main(int argc, char **argv) 
{
    int port = 9090;
    shared_ptr<DataServiceSystemHandler> handler(new DataServiceSystemHandler());
    shared_ptr<TProcessor> processor(new DataServiceSystemProcessor(handler));
    shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
    shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());
    shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());

    shared_ptr<ThreadManager> threadManager =
        ThreadManager::newSimpleThreadManager(10);
    shared_ptr<PosixThreadFactory> threadFactory =
        shared_ptr<PosixThreadFactory>(new PosixThreadFactory());
    threadManager->threadFactory(threadFactory);
    threadManager->start();
    TNonblockingServer server(processor,
            protocolFactory,
            port,
            threadManager);

    printf("Starting the server...\n");
    server.serve();
    printf("done.\n");

    return 0;
}

TNonblockingServer也可以不使用线程池,仅仅使用单线程处理,此时只需在构造TNonblockingServer时不添加threadManager即可,如以下代码:

    TNonblockingServer server(processor,
            protocolFactory,
            port);

TNonblockingServer区别于其他server(例如TThreadPoolServer)在于:TNonblockingServer使用epoll与udp协议(TFramedTransport传输方式)实现,这样既可使用很少的线程实现大并发,而不会像TThreadPoolServer那样并发受线程池线程数限制。
所以使用TNonblockingServer的异步也仅仅是server内部实现思想上的异步,将线程池的阻塞线程处理请求改为了非阻塞串行处理,TNonblockingServer调用serve方法时本身还是会阻塞调用线程。

调用serve方法不阻塞方法应该也很多,并且还有服务端callback方式,有时间找到再补上来吧

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157714.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月27日 下午2:36
下一篇 2022年7月27日 下午2:36


相关推荐

  • tcp粘包是怎么产生的_tcp报文格式

    tcp粘包是怎么产生的_tcp报文格式tcp粘包是怎么产生的?1、什么是tcp粘包?发送方发送的多个数据包,到接收方缓冲区首尾相连,粘成一包,被接收。2、原因TCP协议默认使用Nagle算法可能会把多个数据包一次发送到接收方。应用程读取缓存中的数据包的速度小于接收数据包的速度,缓存中的多个数据包会被应用程序当成一个包一次读取。3、处理方法发送方使用TCP_NODELAY选项来…

    2022年8月11日
    11
  • IOS开发之AVAudioPlayer的基本使用

    IOS开发之AVAudioPlayer的基本使用

    2021年9月14日
    58
  • mqtt客户端c语言开发

    mqtt客户端c语言开发MQTT 客户端 MQTT 客户端开发简介架构图传输层协议层 MQTT 客户端开发 MQTT 消息队列遥测传输 工作在 TCP IP 协议族上 是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布 订阅型消息协议 本篇博客主要记录客户端采用 paho 库二次封装 适配 linux win 平台 使用 c 语言开发 主要内容包括 设计思想 架构设计 程序源码等 简介开发 mqtt 客户端 首先选定 paho 库作为基础收发库 应用具有自己的通信协议 mqtt 客户端需要将数据按照协议封装 然后调用 paho 库进行收发

    2026年3月17日
    2
  • 手把手教你在本地部署 OpenClaw,并低成本接入飞书智能 Agent!

    手把手教你在本地部署 OpenClaw,并低成本接入飞书智能 Agent!

    2026年3月13日
    2
  • eclipse中文插件如何安装_eclipse不显示svn插件

    eclipse中文插件如何安装_eclipse不显示svn插件1、在eclipse中下载插件,地址如下:Name:Subclipse1.2.x(Eclipse3.2+)   URL: http://subclipse.tigris.org/update_1.2.xName:Subclipse1.0.x(Eclipse3.0/3.1)   URL: http://subclipse.tigris.org/up

    2022年10月11日
    6
  • Vue UI组件库

    Vue UI组件库常用 UI 组件库移动端常用 UI 组件库 1 vant2 CubeUI3 MintUI4 https nutui jd com PC 端常用 UI 组件库 1 ElementUI2 IViewUI 这里主要介绍 element ui 的使用安装 npmielement ui 一 全部引入 src main jsimportElem element ui 导入全部组件 import element ui lib theme chalk

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号