clojure - Clojure future 和 Promise 有何不同?

标签 clojure terminology future promise

Future 和 Promise 都会阻塞,直到计算出它们的值,那么它们之间有什么区别?

最佳答案

用 Clojure 术语回答,以下是 Sean Devlin's screencast 中的一些示例:

(def a-promise (promise))
(deliver a-promise :fred)

(def f (future (some-sexp)))
(deref f)

请注意,在 Promise 中,您显式地传递了您在以后的计算中选择的值(在本例中为 :fred)。另一方面, future 正在它被创造的地方被消耗。 some-expr 可能是在幕后启动并串联计算(最终),但如果在访问它时仍未计算它,则线程会阻塞,直到它可用为止。

<小时/>

已编辑添加

为了帮助进一步区分 promise 和 future ,请注意以下事项:

promise

  1. 您创建一个 promise 。现在可以将该 Promise 对象传递给任何线程。
  2. 您继续计算。这些可能是非常复杂的计算,涉及副作用、下载数据、用户输入、数据库访问、其他 promise ——无论你喜欢什么。该代码看起来非常类似于任何程序中的主线代码。
  3. 完成后,您可以将结果传递到该 Promise 对象。
  4. 任何在您完成计算之前尝试取消引用您的 promise 的项目都将被阻止,直到您完成为止。完成并交付 promise 后, promise 将不再阻塞。

future

  1. 你的 future 由你创造。你的 future 的一部分是计算的表达式。
  2. future 可能会也可能不会同时执行。可以为它分配一个线程,可能来自池。它可以只是等待,什么也不做。从你的角度来看你无法判断
  3. 在某些时候,您(或另一个线程)deref是 future 。如果计算已经完成,您将得到结果。如果它还没有完成,你会阻塞直到它完成。 (大概如果它还没有开始,取消引用意味着它开始执行,但这也不能保证。)

虽然您可以将来使表达式与创建 Promise 后的代码一样复杂,但令人怀疑的是,这是否可取。这意味着 future 实际上更适合快速、可后台计算,而 Promise 实际上更适合大型、复杂的执行路径。同样,就可用的计算而言,Promise 似乎更加灵活,并且面向 Promise 创建者完成工作,而另一个线程收获收获。 Future 更倾向于自动启动一个线程(没有丑陋且容易出错的开销)并继续处理其他事情,直到您(原始线程)需要结果。

关于clojure - Clojure future 和 Promise 有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4623536/

相关文章:

clojure - 使用 Ring 和 Compojure 为不同的中间件提供应用程序和 API 路由

java - Clojure/QuantLib 互操作 : classloading woes

windows - 批处理文件中的 at 符号 (@) 是什么,它有什么作用?

terminology - 实现细节的定义是什么?

java - 当等待一个线程的 Future 时,线程执行是否会继续

akka - 线程模型和 AKKA

java - 如何使用 invokeAll() 让所有线程池完成任务?

clojure - Clojure 是否需要 JDK?

c++ - 为什么取消引用称为取消引用的指针?

clojure - 在 clojure 中处理来自 http 服务器的消息流