Zub*_*air 87 terminology future clojure promise
期货和承诺都会阻止,直到他们计算出它们的价值,那么它们之间有什么区别呢?
JUS*_*ION 53
以Clojure术语回答,以下是Sean Devlin的截屏视频:
(def a-promise (promise))
(deliver a-promise :fred)
(def f (future (some-sexp)))
(deref f)
Run Code Online (Sandbox Code Playgroud)
请注意,在承诺中,您明确提供了在稍后的计算中选择的值(:fred在本例中).另一方面,未来正在被创造的同一个地方消费.在some-expr据推测幕后推出,串联(最终)计算的,但如果它仍然通过的时间不计算被访问线程块,直到它可用.
编辑添加
为了进一步区分承诺和未来,请注意以下事项:
promise.该promise对象现在可以传递给任何线程.deliver将结果发送到该承诺对象.deref在您完成计算之前尝试履行承诺的任何项目都会阻止,直到您完成为止.一旦你完成并且你已经deliver履行了承诺,承诺将不再阻止.deref是未来.如果计算已经完成,您将获得结果.如果尚未完成,则阻止直至完成.(据推测,如果还没有开始,deref那就意味着它开始执行,但这也不能得到保证.)虽然您可以在将来使表达式像创建承诺之后的代码那样复杂,但是令人怀疑是否可取.这意味着期货更适合快速,可进行背景的计算,而承诺更适合于大型,复杂的执行路径.在可用的计算方面,承诺似乎更加灵活,并且面向承诺创造者完成工作,另一个线索收获丰收.期货更倾向于自动启动一个线程(没有丑陋和容易出错的开销)并继续其他事情,直到你 - 原始线程 - 需要结果.
Dim*_*gog 23
Future和Promise都是将生产者与消费者之间的异步计算结果进行通信的机制.
在Future的情况下,计算在Future创建时定义,异步执行"ASAP"开始.它还"知道"如何产生异步计算.
在的情况下,承诺的计算,它的开始时间和[可能] 异步调用从输送机构分离.当计算结果可用时,Producer必须deliver显式调用,这也意味着Producer控制何时结果可用.
对于Promises Clojure通过使用相同的对象(promise调用结果)来产生设计错误,以产生(deliver)和消耗(deref)计算结果.这是两个非常不同的能力,应该这样对待.
| 归档时间: |
|
| 查看次数: |
13085 次 |
| 最近记录: |