gpt4 book ai didi

asynchronous - Clojure 中的短路 future

转载 作者:行者123 更新时间:2023-12-03 00:31:53 25 4
gpt4 key购买 nike

我有两个解析为 bool 值的 future。我基本上想做类似的事情

(if (or @future1 @future2) 
...)

但是,通过优化,无论哪个先完成,如果这是真的,那么我不会等待剩余的 future 完成;去吧。当然,如果该值为 false,则等待剩余的 future 完成。有没有一种简单的方法可以做到这一点?

最佳答案

一般情况下,您可以向两个交付者给予相同的 promise 。例如:

(defn foo []
(let [p (promise)]
(future
(Thread/sleep (rand-int 1000))
(deliver p :a))
(future
(Thread/sleep (rand-int 1000))
(deliver p :b))
@p))

调用(foo)将随机产生:a:b尽快第一条deliver发生;其他deliver将是一个空操作。

对于您的具体情况,您需要返回两个 bool 值。我唯一能想到的(而且有点困惑)是使用交付者之间共享的第三个 promise :

(defn foo []
(let [a (promise)
b (promise)
link (promise)]
(future
(Thread/sleep (rand-int 5000))
(let [res (rand-nth [true false])]
(deliver link res)
(deliver a res)))
(future
(Thread/sleep (rand-int 5000))
(let [res (rand-nth [true false])]
(deliver link res)
(deliver b res)))
{:or (or @link @a @b)
:a? (realized? a)
:b? (realized? b)
:link @link
:a @a
:b @b}))
  • 如果a交付true首先,or立即完成。
  • 如果a交付false首先,@a立即返回,然后阻止 @b .
  • 如果b交付true首先,or立即完成。
  • 如果a交付false首先,它阻止 @a .

重复调用(foo)您应该看到预期的结果,特别是当 :or 时是 true ,然后有时:a?:b?将是false ,但两者始终都是 true如果:orfalse .

关于asynchronous - Clojure 中的短路 future,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16868252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com