Clojure 客户端可以通过使用deref(或@)等待。客户端重用结果,因此计算不会运行多次
它们在执行计算的方式上有所不同:Clojure 客户端可以通过使用deref(或@)等待。客户端重用结果,因此计算不会运行多次,clojure,terminology,future,promise,Clojure,Terminology,Future,Promise,它们在执行计算的方式上有所不同: future将在不同的工作线程中启动计算deref将阻止,直到结果就绪 当第一个客户端使用deref或force时,delay将延迟执行计算 promise提供了最大的灵活性,因为它的结果是通过使用deliver以任何自定义方式交付的。当future或delay与您的用例不匹配时,您可以使用它 你确定承诺就是未来吗?我找不到它实现了接口。对不起,我按错了回车键。我的问题变了,我的答案是一般意义上的,不是Clojure特有的。用Java代码回答一个关于Cloju
将在不同的工作线程中启动计算future
将阻止,直到结果就绪deref
- 当第一个客户端使用
或deref
时,force
将延迟执行计算delay
提供了最大的灵活性,因为它的结果是通过使用promise
以任何自定义方式交付的。当deliver
或future
与您的用例不匹配时,您可以使用它delay
future
调用的主体可以包含N个sexprs。这个解释应该是Clojure的一部分Doc@oskarkv假设您创建了一个承诺,并将其交给了3个客户。没有任何东西可以阻止其中一个客户端使用虚假结果解析它并将其发送给另外两个客户端。此外,你将无法解决这个承诺了。相反,如果您有一对promise+解析器,向您的客户承诺并为自己保留解析器,那么这种情况就不可能发生。有关更多信息,建议搜索词为“基于能力的访问控制”和“基于能力的安全性”。我不确定将安全性与像promise
这样的简单引用类型(查看其impl)耦合是否方便邪恶的消费者很少;没有什么能阻止你在承诺的基础上构建自己的抽象。这与安全无关,只是碰巧基于能力的编程经常被描述为与安全相关。在这里,一切都是关于代码正确性的。经常使用的术语是“构造正确”,问题是“你能构造一个错误的程序吗?”?不是故意的,而是偶然的。使用单个Promise对象可以,而使用两个单独的对象则不能。如果这是您想要的,那么没有任何东西可以阻止您返回无法交付的承诺:(defn undeliverable Promise[](let[p(Promise)](具体化clojure.lang.IDeref(deref[;](deref p))clojure.lang.IBlockingDeref(deref[;ms val](deref p ms val))clojure.lang.IPending(isRealized[](.isRealized p))clojure.lang.IFn(invoke[u]nil))
指出了计算机制是如何解耦的,这篇文章给出了一个非常简洁的解释。谢谢
(def a-promise (promise))
(deliver a-promise :fred)
(def f (future (some-sexp)))
(deref f)