首页 > 解决方案 > 原子映射中的 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

谢谢,

标签: multithreadingclojurepromise

解决方案


Atoms旨在解决这个问题:

在内部,交换!读取当前值,将函数应用于它,并尝试比较和设置!它进入。由于另一个线程可能在中间时间更改了值,它可能必须重试,并在自旋循环中这样做。

因此,只要两个线程不为映射使用相同的键(:a :b :c),你在这里是安全的。


推荐阅读