首页 / 知识

关于计算机科学:什么是期货?

2023-04-16 10:06:00

关于计算机科学:什么是期货?

What are futures?

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


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

C ++示例如下。

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

1
2
3
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,从而使用Future方式。在这种情况下,add函数仅在尝试使用尚未计算的值时才会阻塞(也可以创建纯惰性的替代方法)。

1
2
3
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,期货和惰性评估,请参见lazy.rb。

它们可能可以用任何具有线程的语言来实现,尽管用C之类的低级语言显然要比使用高级功能语言要困难得多。


每个人都出于懒惰计算的目的提到期货。但是,另一个不如广告宣传的用途是使用Future for IO。特别是它们对于加载文件和等待网络数据很有用


Future封装了延迟的计算,通常用于将懒惰求值转换为非懒惰语言。第一次评估future时,将运行评估该future所需的代码,并将future替换为结果。

由于将来已被替换,因此后续评估不会再次执行代码,而只会产生结果。


这篇博客文章给出了非常详尽的解释,并提供了有关如何自己实现未来的示例。我真的推荐它:)


期货还用于某些设计模式,特别是用于实时模式,例如ActiveObject模式,该模式将方法调用与方法执行分开。设置将来以等待完成的执行。当您需要从多线程环境转移到与单线程环境进行通信时,我倾向于看到它。在某些情况下,某些硬件不支持线程内核,并且在这种情况下使用期货。乍一看,您如何沟通并不明显,而令人惊讶的是,期货使交易变得相当简单。我有一些C#代码。我将其挖掘出来并发布。


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

从文章:

A future is associated with a
specific thread that computes its
value. This computation may be started
either eagerly when the future is
created, or lazily when its value is
first needed.

在本文中未提及,期货是Monad,因此可以将期货价值的函数投影到monad中,以便在可用时将其应用于期货价值,从而产生另一个期货,而期货又表示该函数的结果。


期货计算机科学计算评估

最新内容

相关内容

猜你喜欢