原子映射中的Clojure承诺



我正试图跟踪对服务器的请求,并在数据准备就绪时采取措施。我有下面的代码,它似乎可以工作,但我想知道是否有更好的方法来做到这一点——特别是我觉得奇怪的是,在下面的未来,我在取消引用原子中取消引用一个承诺,原子可能会改变状态。

(def requests (atom {:a (promise) :b (promise)}))
(future @(:b @requests) (println "b is ready"))
(swap! requests assoc :c (promise))
(deliver (:b @requests) 100)
>> b is ready

谢谢你,

Atoms的设计正是为了解决这个问题:

内部,交换!读取当前值,将函数应用于它,并尝试比较和设置!因为另一个线程可能如果在干预时间内更改了值,则可能必须重试,并且在旋转循环中这样做。

因此,只要两个线程对映射(:a:b:c(不使用相同的键,这里就安全了。

我看到的这种方法的主要问题是,你把这个承诺放在一个原子中,但如果有人真的改变了原子以包含不同的承诺,你的程序就会崩溃:观察者将等待一个其他人都没有引用的承诺,我会把promise放在一些不可变的结构中,这些结构由需要通信的代码的两个部分共享。

你可以更喜欢使用core.async通道而不是promise,但如果你只需要提供一个值,promise就可以了。

最新更新