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
- 您创建一个
promise
。现在可以将该 Promise 对象传递给任何线程。 - 您继续计算。这些可能是非常复杂的计算,涉及副作用、下载数据、用户输入、数据库访问、其他 promise ——无论你喜欢什么。该代码看起来非常类似于任何程序中的主线代码。
- 完成后,您可以将结果
传递
到该 Promise 对象。 - 任何在您完成计算之前尝试
取消引用
您的 promise 的项目都将被阻止,直到您完成为止。完成并交付
promise 后, promise 将不再阻塞。
future
- 你的 future 由你创造。你的 future 的一部分是计算的表达式。
- future 可能会也可能不会同时执行。可以为它分配一个线程,可能来自池。它可以只是等待,什么也不做。从你的角度来看你无法判断。
- 在某些时候,您(或另一个线程)
deref
是 future 。如果计算已经完成,您将得到结果。如果它还没有完成,你会阻塞直到它完成。 (大概如果它还没有开始,取消引用
意味着它开始执行,但这也不能保证。)
虽然您可以将来使表达式与创建 Promise 后的代码一样复杂,但令人怀疑的是,这是否可取。这意味着 future 实际上更适合快速、可后台计算,而 Promise 实际上更适合大型、复杂的执行路径。同样,就可用的计算而言,Promise 似乎更加灵活,并且面向 Promise 创建者完成工作,而另一个线程收获收获。 Future 更倾向于自动启动一个线程(没有丑陋且容易出错的开销)并继续处理其他事情,直到您(原始线程)需要结果。
关于clojure - Clojure future 和 Promise 有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4623536/