什么是期货?
什么是期货?这与懒惰的评估有关。
解决方案
回答
Future封装了延迟的计算,通常用于将懒惰求值转换为非懒惰语言。第一次评估future时,将运行评估该future所需的代码,并将future替换为结果。
由于替换了未来,因此后续评估不会再次执行代码,而只会产生结果。
回答
创建未来时,将启动一个新的后台线程,该线程开始计算实际值。如果我们请求Future的值,它将阻塞直到线程完成计算。当我们需要并行生成一些值并且不想手动跟踪所有值时,这非常有用。
有关Ruby或者Scala,期货和惰性评估,请参见lazy.rb。
它们可能可以用任何具有线程的语言来实现,尽管显然,在像C这样的低级语言中要比在高级功能语言中要困难得多。
回答
维基百科上有一篇关于期货的文章。简而言之,这是一种使用未知值的方法。然后可以按需计算该值(延迟评估),并且可以选择与主要计算同时进行。
下面是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
来使用Future方式,该方法会返回一个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 for IO。特别是它们对于加载文件和等待网络数据很有用
回答
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中,以便在可用时将其应用于期货价值,从而产生另一个期货,而期货又代表了该函数的结果。
回答
期货还用于某些设计模式,特别是用于实时模式,例如ActiveObject模式,该模式将方法调用与方法执行分开。设置将来以等待完成的执行。当我们需要从多线程环境转移到与单线程环境进行通信时,我倾向于看到它。在某些情况下,某件硬件不支持线程内核,并且在这种情况下使用了Future。乍一看,沟通方式并不明显,而令人惊讶的是,期货使交易变得相当简单。我有一些Ccode。我将其挖掘出来并发布。