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
    与您的用例不匹配时,您可以使用它



你确定承诺就是未来吗?我找不到它实现了接口。对不起,我按错了回车键。我的问题变了,我的答案是一般意义上的,不是Clojure特有的。用Java代码回答一个关于Clojure的问题似乎有点异想天开。我不知道为什么这个问题的答案是-1,或者你现在问问题之前不知道答案的问题是什么?我没有-1任何答案??我们怎么知道谁在问题或答案上加了-1?你和我都不能,祖贝尔。我只是好奇谁对你的问题投了-1分,因为这是一个非常合理的问题,而且肯定是关于这个问题的。但是你可以有任何计算障碍,直到承诺或未来完成。ie:(@a+@b)对未来和允诺都同样有效。在我看来,允诺允许更大的灵活性。我创造了一个承诺。我把这个承诺传给另一个线程。然后,我可以做很多复杂的计算,包括等待I/O、从互联网下载数据、等待用户输入等。当所有这些都完成后,我会兑现承诺,并带来相应的价值。未来包括一个S表达式。我想,这可能是一个非常非常复杂的S表达式,但会有点。。。那里很僵硬。此外,future在线程(或池)中自动执行其工作。在promise中执行同样的操作将意味着更多的工作。FWIW由于单个s表达式可以是对任意代码路径的调用,因此不一定是关于可以在表达式中填充多少代码。因此,与其说承诺“更灵活”,不如说它的目的完全不同。否则,为什么两者都有?为了记录在案,
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)