14

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

4

7 回答 7

9

有一篇关于期货的维基百科文章。简而言之,这是一种使用未知值的方法。然后可以按需计算该值(惰性评估),并且可以选择与主计算同时进行。

C++ 示例如下。


假设您要计算两个数字的总和。您可以使用典型的 Eager 实现:

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); }));
于 2008-09-17T06:23:44.880 回答
7

当您创建未来时,会启动一个新的后台线程,开始计算实际值。如果你请求future的值,它将阻塞直到线程完成计算。当您需要并行生成一些值并且不想手动跟踪所有值时,这非常有用。

有关Ruby 或Scala、futures 和惰性求值的信息,请参见lazy.rb。

它们可能可以用任何带有线程的语言来实现,尽管在像 C 这样的低级语言中显然比在高级函数式语言中更困难。

于 2008-09-17T06:12:24.110 回答
6

大家为了懒计算而提到期货。然而,另一个没有宣传的用途是使用 Futures for IO。特别是它们对于加载文件和等待网络数据很有用

于 2008-09-17T06:54:40.437 回答
3

Future 封装了延迟计算,通常用于将惰性求值硬塞到非惰性语言中。第一次评估未来时,运行评估它所需的代码,并将未来替换为结果。

由于 future 被替换,后续的评估不会再次执行代码,而只是简单地产生结果。

于 2008-09-17T06:11:23.707 回答
0

Wiki 文章很好地概述了期货。该概念通常用于并发系统中,用于在可能尚未计算或尚未计算的值上调度计算,此外,其计算可能已经或可能尚未在进行中。

来自文章:

未来与计算其值的特定线程相关联。这个计算可以在创建未来时急切地开始,或者在第一次需要它的值时懒惰地开始。

文章中没有提到, future 是Monad,因此可以将未来值的函数投影到 monad 中,以便在可用时将它们应用于未来值,从而产生另一个未来,这反过来又代表了该函数的结果.

于 2008-09-17T07:14:21.780 回答
0

Futures 也用于某些设计模式,特别是实时模式,例如 ActiveObject 模式,它将方法调用与方法执行分开。未来被设置为等待完成的执行。当您需要从多线程环境迁移到与单线程环境进行通信时,我倾向于看到它。在某些情况下,某个硬件没有内核支持线程,在这种情况下使用期货。乍一看,你将如何沟通并不明显,令人惊讶的是,未来让它变得相当简单。我有一些 c# 代码。我会挖出来贴出来。

于 2009-08-17T12:30:58.370 回答
0

这篇博文给出了一个非常详尽的解释,以及一个如何自己实现未来的例子。我真的推荐它:)

于 2011-04-05T07:30:26.627 回答