[ thrift 在python中使用了 tornado和  twisted 来作为异步的webserive服务提供异步接口,自身并没有实现     twisted:         Generate Twisted-friendly RPC services

关于异步,我找了很多资料,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的类以供实现异步调用,初步看到是使用回调函数进行的。

此种方法正在研究中,随后会将研究结果补充上来[半同步半异步的服务端模型,需要指定为: TFramedTransport 数据传输的方式。使用TAsyncClientManager处理客户端异步调用。]

服务端异步

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 handler(new DataServiceSystemHandler());

shared_ptr processor(new DataServiceSystemProcessor(handler));

shared_ptr serverTransport(new TServerSocket(port));

shared_ptr transportFactory(new TBufferedTransportFactory());

shared_ptr protocolFactory(new TBinaryProtocolFactory());

shared_ptr threadManager =

ThreadManager::newSimpleThreadManager(10);

shared_ptr threadFactory =

shared_ptr(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方式,有时间找到再补上来吧[本文由larrylgq编写,转载请注明出处:http://blog.csdn.net/larrylgq/article/details/7497342作者:吕桂强邮箱:larry.lv.word@gmail.com首先创建thrift文件namespace ja

java thrift异步调用_thrift异步调用 - thrift-cob_style-tnonblockingserver - ItBoth相关推荐

  1. Thrift中实现Java与Python的RPC互相调用

    场景 Thrift介绍以及Java中使用Thrift实现RPC示例: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1086894 ...

  2. java异步调用微信接口_微信支付V3 SDK(Java版,支持同步异步调用)

    我们在开发微信支付时,发现微信官方已经对SDK做了升级,V3版本的SDK从设计上符合RESTful规范. 我们再在开源库中寻找是否有现成de开箱即用.并且支持响应式编程的SDK版本.经过一凡寻找,令我 ...

  3. java 多异步调用_java 异步调用与多线程

    异步与多线程的区别 一.异步和多线程有什么区别?其实,异步是目的,而多 线程是实现这个目的的方法.异步是说,A发起一个操作后(一般都是比较耗时的操作,如果不耗时的操作 就没有必要异步了),可以继续自顾 ...

  4. 深入剖析通信层和RPC调用的异步化(上)

    <Netty 进阶之路>.<分布式服务框架原理与实践>作者李林锋深入剖析通信层和 RPC 调用的异步化.李林锋此后还将在 InfoQ 上开设 Netty 专题持续出稿,感兴趣的 ...

  5. Spring Boot 异步请求和异步调用

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 一.Spring Boot中异步请求的使用 1.异步请求与同步请求 ...

  6. 面试官 | SpringBoot 中如何实现异步请求和异步调用?

    作者 | 会炼钢的小白龙 来源 | cnblogs.com/baixianlong/p/10661591.html 一.SpringBoot中异步请求的使用 1.异步请求与同步请求 特点: 可以先释放 ...

  7. Spring调用vertx异步service Interface

    Spring调用Vertx异步service Interface 情景 原理 实现 工程结构说明 目录结构 样例代码 example-vertx-interface pom依赖 代码 example- ...

  8. 【C/C++服务器开发】同步与异步、阻塞与非阻塞、同步调用和异步调用的概念

    同步与异步 首先我们要明确的是,同步和异步都是针对两个或者两个以上的事物来说的.比如当我们在网上购物看中一件物品,然后去浏览该商品详情的时候,首先页面会先发送一个请求,后台服务器查询对应商品的相关数据 ...

  9. 第11章 异步消息与异步调用

    开心一笑 [老爸斗地主把豆豆输光了,叫我给他充值.我说他不要在游戏里花钱,打发时间玩玩得了.老爸一下火了:小时候你要哪个玩具老子不给你买了,现在让你给我买点豆豆你都不肯,看来老了是指望不上你了... ...

最新文章

  1. 排序算法汇总——转载自http://blog.csdn.net/zhanglong_daniel/article/details/52513058
  2. jquery字体颜色_基于jquery实现的web版excel
  3. .NET : 通过配置文件指定跟踪(trace)选项
  4. linux 760权限,Linux 文件rwx权限问题 chmod 777 XXX 任何人拥有最高权限
  5. 2.2.1操作系统之处理机调度的概念及层次
  6. 实习推荐 | 腾讯AI Lab虚拟人中心招聘算法工程师实习生
  7. nginx中文件路径表示方法
  8. 根据数据库表gengxin实体类_ASP.NET开发实战——(十二)数据库之EF Migrations
  9. 如何评价一个开源项目——价值流网络
  10. springMVC问题XXX is not mapped [from XX]或者Unknown entity: com.spring.main.pojo.Person
  11. ks检验正态分布结果_KS检验及其在机器学习中的应用
  12. 与女儿谈商业模式 (4):戴尔的成功秘诀
  13. CCF201703-3 Markdown(100分)【文本处理】
  14. 如何在 Mac App Store 中查看和阅读隐私标签?
  15. js将html替换字符串,js 替换字符串指定内容 javascript 替换指定位置的字符
  16. c语言fprintf 数组,C语言fprintf()函数:格式化输出到一个流中
  17. c#winform单表生树
  18. 少有人走的路:心智成熟的旅程
  19. 在vs中怎样一次性的添加一个文件夹到解决方案里
  20. 2022吴恩达机器学习第二周

热门文章

  1. shell中base64编解码的使用
  2. 关于windows11的0x800f0950语言包安装失败
  3. 大华摄像头离线故障:要拔除SD卡
  4. 【JUC源码专题】Striped64 核心源码分析(JDK8)
  5. python模拟微信发红包,并验证随机性
  6. Python游戏概率补偿算法-马尔科夫链
  7. 谷歌浏览器(Chrome)最新v80版本下载
  8. CAD如何删除图层 显示未删除选定图层
  9. 工业4.0智能工厂建设核心:APS高级计划排程
  10. 在opensuse上安装TL-WDN5200免驱版无线网卡