Computer science 什么是未来?

Computer science 什么是未来?,computer-science,terminology,future,Computer Science,Terminology,Future,什么是未来?这与惰性计算有关。Future封装了一个延迟计算,通常用于将惰性计算硬塞进非惰性语言中。第一次计算future时,将运行计算future所需的代码,并用结果替换future 由于未来被替换,后续的计算不会再次执行代码,只会产生结果。创建未来时,将启动一个新的后台线程,开始计算实际值。如果您请求future的值,它将阻塞,直到线程完成计算。当您需要并行生成一些值,并且不想手动跟踪所有值时,这非常有用 请参阅查找Ruby或 它们很可能可以用任何带有线程的语言实现,尽管用像C这样的低级语言

什么是未来?这与惰性计算有关。

Future封装了一个延迟计算,通常用于将惰性计算硬塞进非惰性语言中。第一次计算future时,将运行计算future所需的代码,并用结果替换future


由于未来被替换,后续的计算不会再次执行代码,只会产生结果。

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

请参阅查找Ruby或

它们很可能可以用任何带有线程的语言实现,尽管用像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
,它返回一个
std::future
。在这种情况下,
add
函数仅在尝试使用尚未计算的值时才会阻塞(也可以创建一个纯惰性替代值)

intadd(futurei,futurej){returni.get()+j.get();}
int sum=add(async(launch::async,[](){return Nth_prime(4);}),
异步(launch::async,[](){return Nth_prime(2);}));

每个人都提到期货是为了懒散的计算。然而,另一个并不像广告所宣传的那样的用途是在一般情况下对IO使用期货。尤其是在加载文件和等待网络数据时,它们非常有用。

提供了未来的良好概述。该概念通常用于并发系统中,用于对可能已经计算或可能尚未计算的值进行调度计算,此外,其计算可能正在进行,也可能尚未进行

从文章中:

未来与未来联系在一起 计算其 价值可以开始此计算 当未来来临的时候 创建,或在其值为 首先需要


文章中没有提到,未来是一个函数,因此可以将未来值上的函数投影到monad中,以便在未来值可用时将其应用于未来值,从而产生另一个未来值,该未来值反过来表示该函数的结果。

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

给出了一个非常透彻的解释,并举例说明了如何自己实现未来。我真的推荐它:)

好吧,期货在实际被请求之前不会开始执行。期货通常用于构建惰性屏障,例如,为了实现无限结构。如果futures在创建后立即开始执行,那么它们就不适合这种情况。@012…:检查我发布的链接,它们很好地概述了futures。似乎是一个更明确的参考。(哈哈!维基百科!)摘要:期货一开始并没有同时执行;现在有些人将其定义为这样做,并将原始概念重命名为承诺。@0124816:并非所有期货都是在请求时执行的,而不是在创建时执行的。只有懒惰的未来才会有这种行为。在某些情况下,懒惰是不好的,未来将根据定义开始执行。未来不一定与懒惰评估有关。事实上,对于许多用例来说,懒惰的未来正是您不需要的:IO、网络等等……“未来”目前通过JavaScript获得了大量曝光!但是JavaScript领域的术语是“延迟”和“承诺”。
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); }));