写点什么

Facebook 为 C++11 带来了健壮且强大的 Folly Futures 库

2015 年 7 月 30 日

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

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

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

复制代码
#include <folly/futures/Future.h>
using folly::Future;
Future<Output> asyncOperation(Input);
Future<Output> f = asyncOperation(input);

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

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

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

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

复制代码
Future<OutputA> futureA(Output);
Future<OutputB> futureB(OutputA);
Future<OutputC> futureC(OutputB);
OutputD d(OutputC) {
if (somethingExceptional) throw anException;
return OutputD();
}
Future<double> 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<void()>;
virtual void add(Func) = 0;
};
a(input).then(executor, b);

更多信息可以参见 Folly Future 的文档

查看英文原文: Facebook Folly Brings Robust, Powerful Futures to C++11

()>


感谢丁晓昀对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015 年 7 月 30 日 08:406252

评论

发布
暂无评论
发现更多内容

架构师实战营 模块一总结

代廉洁

架构实战营

Hadoop-离线批处理技术

进击的梦清

大数据 hadoop 批处理

百度南渡,护航泉州水务的产业智能化征程

脑极体

如何打造更为精准的个性化推荐?Amazon Personalize 有独门技术秘籍!

亚马逊云科技 (Amazon Web Services)

如何批评下属?

石云升

团队建设 28天写作 职场经验 管理经验 4月日更

如何从零开始学Python:(5)如何处理列表中嵌套多个列表?

广之巅

Python 四月日更

AIOps智能运维

进击的梦清

运维自动化 AIOPS 智能

Storm-实时计算系统

进击的梦清

大数据 批处理 Storm

乘“云”加速疾病诊断研发,亚马逊云科技新阶段“诊断开发计划”已开启!

亚马逊云科技 (Amazon Web Services)

文章发布后的阅读量只有个位数该怎么办?

十三

程序员 写作 写作平台 写作技巧 写文章 快速写作 写作方法

警惕数据泄露!快给你的数据加上安全密钥!

亚马逊云科技 (Amazon Web Services)

大数据-Big Data

进击的梦清

大数据

Zip和7-zip谁更强,如何选择?

麦洛

ZIP格式 ZIP zip4j

Open Source Load Testing Tool Review 2020

OutOfMemory1024

Load Testing Open Source

Linux OOM Killer

OutOfMemory1024

Linux

牛P牛P!Github上堪称2021最全、最新Java面试题库到底有多香?

比伯

Java 程序员 架构 编程语言 技术宅

低开销获取时间戳

捉虫大师

Java

运动的这两个价值,你知道吗?|靠谱点评

无量靠谱

《专访阿里研究员吴翰清:云时代,如何建设更安全的互联网环境?》(采访提纲)

xiezhr

网络安全 阿里吴翰清

Guide to UUID in Java

OutOfMemory1024

Java

Redis - 跳表以及其内部结构

insight

redis 4月日更

程序员如何写好一篇技术文章?

十三

程序员 面试 写作 写作技巧 写文章 快速写作 写作方法

不惧业务规模与复杂性,实现敏捷的云转型“三步走”就对了 | 云途专栏

亚马逊云科技 (Amazon Web Services)

话题讨论|To B & To G,互联网公司的下一主战场

程序员架构进阶

话题讨论 28天写作 4月日更 To B业务 领域思考

微服务架构核心基础讲解

麦洛

微服务

采访彩食鲜 CTO乔新亮:程序员如何持续的登上新台阶

风翱

4月日更 采访提纲

计算机原理学习笔记 Day12

穿过生命散发芬芳

计算机原理 4月日更

TO B产品从0到1:从项目中走出来

菜根老谭

产品孵化

基于mysqldump聊一聊MySQL的备份和恢复

麦洛

MySQL MySQL 运维 数据备份

轻松搞定XML和对象之间的互转,就它了!

麦洛

xml XStream

Ubuntu 20.04 启用休眠(Hibernate)配置过程

OutOfMemory1024

Ubuntu20.04

低代码的认知误区与落地实践

低代码的认知误区与落地实践

Facebook为C++11带来了健壮且强大的Folly Futures库-InfoQ