Facebook为C++11带来了健壮且强大的Folly Futures库
发布日期:2021-06-30 18:19:02 浏览次数:2 分类:技术文章

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

英文原版:

是一种用于同步并发操作的,它能够被视为对异步操作结果的只读代理对象,这个对象的初始值是未知的。如果Future的客户端试图在操作完成前读取它的值,

可能会被阻塞。Future通常和一个Promise关联,Promise提供对Future的值进行写访问。

异步操作能够立即返回只读的Future,而不阻塞,示例代码片段如下:

#include 
using folly::Future;Future
asyncOperation(Input);Future f = asyncOperation(input);

这里的asyncOperation是一个异步调用的包装。Future的客户端能够通过isReady()方法检查其关联的Promise是否已经完成,并通过value()方法获取其结果。

Future由它关联的Promise创建,当异步操作完成时,可以通过setValue()或者setWith()方法设置它的结果:

using folly::Promise;Future
getEnergy(int year) { auto promise = make_shared
>(); std::thread([=]{ promise->setWith(std::bind(getEnergySync, year)); }).detach(); return promise->getFuture();}

Folly Futures库真正强大之处在于其Future::then方法,该方法能够方便地进行链式回调,避免进入(callback hell)。回调链可以这样来表示:

Future
futureA(Output);Future
futureB(OutputA);Future
futureC(OutputB);OutputD d(OutputC) { if (somethingExceptional) throw anException; return OutputD();}Future
fut = fooFuture(input) .then(futureA) .then(futureB) .then(futureC) .then(d) .then([](OutputD outputD) { // 同样支持lambda表达式 return outputD * M_PI; });

Folly Futures库提供的另一个强大的构建块是集合方法,它允许将Future集合视为一个Future,这个Future在集合中的全部Future完成时完成。

 

和集合方法类似,Folly Futures库还提供了方法:

  • collectAny:当集合中的任何一个Future完成时即完成。
  • collectN:等待N个Future完成后完成。
  • map:参数为Future集合和一个函数,针对集合参数中的每个Future,调用函数参数的then()方法。返回值是一个新的Future数组。
  • reduce:参数为Future集合和带有两个参数的函数(reduce的值和reduce序列中的下一个值),针对集合参数中的每个Future,依次调用函数参数。

最后,Folly Futures还支持通过来控制回调的执行。例如,你能够给then方法传入一个执行器对象,指定此次回调应该通过这个执行器来执行:

struct Executor {  using Func = std::function
; virtual void add(Func) = 0;};a(input).then(executor, b);

更多信息可以参见Folly Future的。

 

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

上一篇:Tars框架Future/Promise使用
下一篇:Facebook 的 C++ 11 组件库 Folly Futures

发表评论

最新留言

不错!
[***.144.177.141]2024年05月03日 17时41分59秒

关于作者

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

推荐文章

Boundary loss 损失函数 2019-04-30
神经网络调参实战(一)—— 训练更多次数 & 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