微信号:infoqchina

介绍:有内容的技术社区媒体

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

2015-08-10 12:00 金灵杰 译

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);



更多详情可点击“阅读原文”查看

有话想说?!戳“写评论”👇

 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 作为一个程序员,进步完全取决自己 Android进程与线程 重磅!2016年程序员就业形势分析报告 阿里、京东、亚马逊的仓库都被打开了!哪家最强? perl黑魔法[九]双冒号::