什么是期货?这与惰性评估有关。
7 回答
有一篇关于期货的维基百科文章。简而言之,这是一种使用未知值的方法。然后可以按需计算该值(惰性评估),并且可以选择与主计算同时进行。
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); }));
当您创建未来时,会启动一个新的后台线程,开始计算实际值。如果你请求future的值,它将阻塞直到线程完成计算。当您需要并行生成一些值并且不想手动跟踪所有值时,这非常有用。
有关Ruby 或Scala、futures 和惰性求值的信息,请参见lazy.rb。
它们可能可以用任何带有线程的语言来实现,尽管在像 C 这样的低级语言中显然比在高级函数式语言中更困难。
大家为了懒计算而提到期货。然而,另一个没有宣传的用途是使用 Futures for IO。特别是它们对于加载文件和等待网络数据很有用
Future 封装了延迟计算,通常用于将惰性求值硬塞到非惰性语言中。第一次评估未来时,运行评估它所需的代码,并将未来替换为结果。
由于 future 被替换,后续的评估不会再次执行代码,而只是简单地产生结果。
Futures 也用于某些设计模式,特别是实时模式,例如 ActiveObject 模式,它将方法调用与方法执行分开。未来被设置为等待完成的执行。当您需要从多线程环境迁移到与单线程环境进行通信时,我倾向于看到它。在某些情况下,某个硬件没有内核支持线程,在这种情况下使用期货。乍一看,你将如何沟通并不明显,令人惊讶的是,未来让它变得相当简单。我有一些 c# 代码。我会挖出来贴出来。
这篇博文给出了一个非常详尽的解释,以及一个如何自己实现未来的例子。我真的推荐它:)