什么是期货?这与懒惰的评估有关。
答案 0 :(得分:9)
关于未来有一个Wikipedia article。简而言之,它是一种使用尚未知道的值的方法。然后可以根据需要计算该值(延迟评估),并且可选地,与主计算同时计算。
C ++示例如下。
假设您要计算两个数字的总和。您可以拥有典型的热切实施:
int add(int i, int j) { return i + j; }
// first calculate both Nth_prime results then pass them to add
int sum = add(Nth_prime(4), Nth_prime(2));
或者您可以使用C ++ 11的std::async
使用期货方式,它返回std::future
。在这种情况下,add
函数只会在尝试使用尚未计算的值时阻止(还可以创建一个纯粹的惰性替代)。
int add(future<int> i, future<int> j) { return i.get() + j.get(); }
int sum = add(async(launch::async, [](){ return Nth_prime(4); }),
async(launch::async, [](){ return Nth_prime(2); }));
答案 1 :(得分:7)
创建未来时,会启动一个新的后台线程,开始计算实际值。如果您请求未来的值,它将一直阻塞,直到线程完成计算。当您需要并行生成某些值并且不想手动跟踪所有值时,这非常有用。
请参阅lazy.rb了解Ruby,或Scala, futures, and lazy evaluation。
它们可以用任何带有线程的语言实现,但在C等低级语言中显然比在高级函数式语言中更难。
答案 2 :(得分:6)
每个人都提到期货是为了懒惰的计算。然而,另一个不如宣传的用途是一般使用Futures for IO。特别是它们对于加载文件和等待网络数据非常有用
答案 3 :(得分:3)
未来封装了延迟计算,通常用于将懒惰的评估转换为非惰性语言。第一次评估未来时,运行评估它所需的代码,并将结果替换为future。
由于未来被替换,后续评估不再执行代码,只是产生结果。
答案 4 :(得分:0)
The Wiki Article概述了期货。该概念通常用于并发系统,用于调度可能已经或可能尚未计算的值的计算,此外,其计算可能已经或可能尚未进行。
来自文章:
未来与a有关 计算它的特定线程 值。可以开始该计算 或者是未来的热切期待 创造,或懒惰的时候它的价值 首先需要。
文章中没有提及,期货是Monad,因此有可能将未来价值的函数投影到monad中,以便在它们可用时将它们应用于未来值,从而产生另一个未来turn表示该函数的结果。
答案 5 :(得分:0)
期货也用于某些设计模式,特别是实时模式,例如,ActiveObject模式,它从方法执行中分离方法调用。未来设置为等待已完成的执行。当您需要从多线程环境转移到与单线程环境进行通信时,我倾向于看到它。可能存在一块硬件没有内核支持线程的情况,并且在这种情况下使用了future。乍一看,你的沟通方式并不明显,令人惊讶的是,期货让它变得相当简单。我有一些c#代码。我会把它挖出来发布。
答案 6 :(得分:0)
This blog post提供非常彻底的解释以及您如何自己实现未来的示例。我真的推荐它:)