Tars框架Future/Promise使用
发布日期:2021-06-30 18:19:02 浏览次数:2 分类:技术文章

本文共 2814 字,大约阅读时间需要 9 分钟。

2017年4月10日,腾讯后台逻辑层的统一应用框架TAF(Total Application Framework)开源了,取名为。

在采用tars2cpp工具自动生成c++文件时,相应的file.tars会自动生成file.h文件。在.h文件里会生成你自定义接口的RPC方法,一共有四种:

  • 同步(sync)方法;
  • 异步(async)方法;
  • Future/Promise方法;
  • 协程(coco)方法;

sync/async方法在官方文档里都有,对于不满足sync/async,然后想在Tars下使用Future/Promise的同学看看此文或许会有帮助。

文章内容、样例都是基于Tars框架下提供的Future/Promise进行分析,与boost、C++11、以及其他语言提供的Future/Promise不完全相同。

 

Future/Promise是什么?

Future与Promise其实二个完全不同的东西:

Future:用来表示一个尚未有结果的对象,而产生这个结果的行为是异步操作;

Promise:Future对象可以使用Promise对象来创建(getFuture),创建后,Promise对象保存的值可以被Future对象读取,同时将二个对象共享状态关联起来。可以认为Promise为Future结果同步提供了一种手段;

简而言之就是:他们提供了一套非阻塞并行操作的处理方案,当然,你可以阻塞操作来等待Future的结果返回。

 

Future/Promise适用什么场景?

通过一个虚拟的例子来说明:你想买房,然后通过微信联系中介看看行情并询问一些信息,最后拿到所有的信息汇总后再评估。

我们假如有中介A、B、C,并且不考虑超时情况。

同步的做法:我们先微信询问A,等待A的回复,接着询问B,等待B的回复,最后询问C,等待C的回复;

异步的做法:我们先微信询问A,在等待A回复的同时,可以干干其他事情(比如看电视,处理工作),等到A回复后再依次询问B,C;

Future/Promise的做法:同时给A、B、C发消息询问,等待回复的同时干其他事情,一直到所有回复都响应;

根据经验,在这种场景下Future/Promise才是最合适的做法。

因为对于这种场景,询问中介A、B、C是三个没有任何耦合的任务(简单理解就是顺序可以打乱的任务,相互之间无依赖,A->B->C,C->B->A的结果一样),所以Future/Promise最适合。

 

Future/Promise代码例子

假设我们有一个Test应用,他的TestServer内部TestServant提供了Echo服务的接口“EchoTest”。

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

//回调函数

void handleAll(const promise::Future<promise::Tuple<promise::Future<TestServantPrxCallbackPromise::PromisetestPtr>,

                    promise::Future<TestServantPrxCallbackPromise::PromisetestPtr> > > &result)

{

    promise::Tuple<promise::Future<TestServantPrxCallbackPromise::PromisetestPtr>, promise::Future<TestServantPrxCallbackPromise::PromisetestPtr> > out = result.get();

 

    promise::Future<TestServantPrxCallbackPromise::PromisetestPtr> out1 = out.get<0>();

    const tars::TC_AutoPtr<TestServantPrxCallbackPromise::Promisetest> print1 = out1.get();

 

    promise::Future<TestServantPrxCallbackPromise::PromisetestPtr> out2 = out.get<1>();

    const tars::TC_AutoPtr<TestServantPrxCallbackPromise::Promisetest> print2 = out2.get();

 

    DEBUGLOG("handleAll:" << print1->_ret << "|" << print1->outStr << "|out2:" << print2->_ret << "|" << print2->outStr);

}

 

int main()

{

    map<string, string> ctx;

    TestServantPrx testPrx = Application::getCommunicator()->stringToProxy<TestServantPrx>("Test.TestServer.TestServant");

 

    promise::Future<TestServantPrxCallbackPromise::PromisetestPtr > result1 = testPrx->promise_async_EchoTest("manmanlu1", ctx);

    promise::Future<TestServantPrxCallbackPromise::PromisetestPtr > result2 = testPrx->promise_async_EchoTest("manmanlu2", ctx);

 

    promise::Future<promise::Tuple<promise::Future<TestServantPrxCallbackPromise::PromisetestPtr>, promise::Future<TestServantPrxCallbackPromise::PromisetestPtr> > > r =

        promise::whenAll(result1, result2);

    r.then(tars::TC_Bind(&handleAll));

 

    DEBUGLOG("Test Future-Promise done");

}

输出的结果为:

1

2

Test Future-Promise done

handleAll:0|manmanlu1|out2:0|manmanlu2

可以看到异步回调正常触发,最后吐槽一下命名空间:D

(全文结束)

转载地址:https://libaineu2004.blog.csdn.net/article/details/83347893 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:从零开始实现RPC框架 - RPC原理及实现(★firecat推荐★)
下一篇:Facebook为C++11带来了健壮且强大的Folly Futures库

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年05月02日 14时07分47秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

神经网络调参实战(一)—— 训练更多次数 & tensorboard & finetune 2019-04-30
tensorflow使用tensorboard进行可视化 2019-04-30
神经网络调参实战(二)—— activation & initializer & optimizer 2019-04-30
凸优化 convex optimization 2019-04-30
数据库索引 & 为什么要对数据库建立索引 / 数据库建立索引为什么会加快查询速度 2019-04-30
IEEE与APA引用格式 2019-04-30
research gap 2019-04-30
pytorch训练cifar10数据集查看各个种类图片的准确率 2019-04-30
Python鼠标点击图片,获取点击点的像素坐标 2019-04-30
路径规划(一) —— 环境描述(Grid Map & Feature Map) & 全局路径规划(最优路径规划(Dijkstra&A*star) & 概率路径规划(PRM&RRT)) 2019-04-30
神经网络调参实战(四)—— 加深网络层次 & 批归一化 batch normalization 2019-04-30
数据挖掘与数据分析(三)—— 探索性数据分析EDA(多因子与复合分析) & 可视化(1)—— 假设检验(μ&卡方检验&方差检验(F检验))&相关系数(皮尔逊&斯皮尔曼) 2019-04-30
RRT算法(快速拓展随机树)的Python实现 2019-04-30
路径规划(二) —— 轨迹优化(样条法) & 局部规划(人工势能场法) & 智能路径规划(生物启发(蚁群&RVO) & 强化学习) 2019-04-30
D*算法 2019-04-30
强化学习(四) —— Actor-Critic演员评论家 & code 2019-04-30
RESTful API 2019-04-30
优化算法(四)——粒子群优化算法(PSO) 2019-04-30
数据挖掘与数据分析(三)—— 探索性数据分析EDA(多因子与复合分析) & 可视化(2)——回归分析(最小二乘法&决定系数&残差不相关)&主成分分析&奇异值分解 2019-04-30
数据在Oracle中的存储 2019-04-30