什么是期货?

时间:2008-09-17 06:07:58

标签: computer-science terminology future

什么是期货?这与懒惰的评估有关。

7 个答案:

答案 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提供非常彻底的解释以及您如何自己实现未来的示例。我真的推荐它:)