Facebook为C++11带来了健壮且强大的Folly Futures库
发布日期:2021-06-30 18:19:02
浏览次数:3
分类:技术文章
本文共 1673 字,大约阅读时间需要 5 分钟。
英文原版:
是一种用于同步并发操作的,它能够被视为对异步操作结果的只读代理对象,这个对象的初始值是未知的。如果Future的客户端试图在操作完成前读取它的值,
可能会被阻塞。Future通常和一个Promise关联,Promise提供对Future的值进行写访问。
异步操作能够立即返回只读的Future,而不阻塞,示例代码片段如下:
#includeusing folly::Future;Future
这里的asyncOperation是一个异步调用的包装。Future的客户端能够通过isReady()方法检查其关联的Promise是否已经完成,并通过value()方法获取其结果。
Future由它关联的Promise创建,当异步操作完成时,可以通过setValue()或者setWith()方法设置它的结果:
using folly::Promise;FuturegetEnergy(int year) { auto promise = make_shared >(); std::thread([=]{ promise->setWith(std::bind(getEnergySync, year)); }).detach(); return promise->getFuture();}
Folly Futures库真正强大之处在于其Future::then方法,该方法能够方便地进行链式回调,避免进入(callback hell)。回调链可以这样来表示:
FuturefutureA(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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月21日 10时34分47秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
用MATLAB实现m序列的生成(MATLAB 2021a适用)
2019-04-30
MATLAB函数备忘(定期更新)
2019-04-30
13行MATLAB代码实现网络爬虫 爬取NASA画廊星图
2019-04-30
MATLAB指定路径保存图片方法
2019-04-30
Python一键获取微信推送封面图
2019-04-30
油猴脚本:微信推送浏览功能拓展
2019-04-30
JavaScript DOM对象操作详解
2019-04-30
JavaScript 表单操作与MD5加密
2019-04-30
JAVA学习笔记4 - 循环与分支结构
2019-04-30
JAVA学习笔记6 - 数组
2019-04-30
JAVA学习笔记8 - Stream 和 File I/O
2019-04-30
JAVA学习笔记9 - 异常
2019-04-30
JAVA学习笔记10 - 继承
2019-04-30
JAVA学习笔记11 - 接口interface
2019-04-30
JAVA学习笔记12 - 包package
2019-04-30
Android 开发学习笔记 00 - Getting Started
2019-04-30
【学习笔记】Android Activity
2019-04-30
【学习笔记】Android Fragments
2019-04-30
Android使用Retrofit_00_Getting Started
2019-04-30