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

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

\\

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

\\

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

\
\#include \u0026lt;folly/futures/Future.h\u0026gt;\using folly::Future;\Future\u0026lt;Output\u0026gt; asyncOperation(Input);\Future\u0026lt;Output\u0026gt; f = asyncOperation(input);
\

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

\\

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

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

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

\\
\Future\u0026lt;OutputA\u0026gt; futureA(Output);\Future\u0026lt;OutputB\u0026gt; futureB(OutputA);\Future\u0026lt;OutputC\u0026gt; futureC(OutputB);\OutputD d(OutputC) {\  if (somethingExceptional) throw anException;\  return OutputD();\}\Future\u0026lt;double\u0026gt; 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完成时即完成。\\t
  • collectN:等待N个Future完成后完成。\\t
  • map:参数为Future集合和一个函数,针对集合参数中的每个Future,调用函数参数的then()方法。返回值是一个新的Future数组。\\t
  • reduce:参数为Future集合和带有两个参数的函数(reduce的值和reduce序列中的下一个值),针对集合参数中的每个Future,依次调用函数参数。\

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

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

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

\\

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

\\

()\u0026gt;

\\

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

\\

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

\\
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值