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方式,有时间找到再补上来吧

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • dosbox基础使用[通俗易懂]

    dosbox运行程序1、mountc:d:\masm64把d盘masm64的内容挂在到c盘中2、c:进入c盘3、masmname.asm编译name的asm文件,后面要敲回车masmname.asm;编译name的asm文件,后面不用敲回车4、linkname连接name的文件,后面要敲回车linkname;连接name的文件,后面不用敲回车5、name运行name的文件dubug程序1、挂载、进入c盘步骤和前面一样2、debugname.exe3、输入命令

  • 关于python中可迭代对象和迭代器的一些理解

    关于python中可迭代对象和迭代器的一些理解

  • 命令模式 Command「建议收藏」

    命令模式 Command「建议收藏」命令模式 Command动机模式定义实例结构要点总结笔记动机在软件构建过程中,“行为请求者”与”行为实现者”通常呈现一种”紧耦合”,但在某些场合—-比如需要对行为进行记录,撤销/重(Undo / Redo),事务”等处理,这种无法抵御变化的紧耦合是不合适的在这种情况下,如何将”行为请求者”和”行为实现这”解耦?将一组行为抽象为对象,可以实现两者之间的松耦合模式定义将一个请求(行为)封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作实例#i

  • MySQL 改动用户password及重置rootpassword「建议收藏」

    MySQL 改动用户password及重置rootpassword

  • Python 逐行读取txt 文件并生成列表

    前言开始1.载入文件2.读取数据流3.数据处理4.关闭文件前言我们在编写一些自动化脚本的时候,为了方便,经常需要以txt文件作为数据输入,今天就跟大家讨论一下如何对txt文件进行读取并生成对应的列表等程序可操作的数据载体。开始1.载入文件这步就大家比较熟悉,文件操作中最基本的了。因为我们只需要读取文件,并不需要写入文件,所以在这里指定mode=”r”为只读模式(默认)。f=open(“C:/foo.txt”,”r”,encoding=’utf-8′)此时就有了这.

  • 没钱买珍珠首饰,能够画一个[通俗易懂]

    没钱买珍珠首饰,能够画一个

发表回复

您的电子邮箱地址不会被公开。

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