multithreading - 原子映射中的 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),你在这里是安全的。
推荐阅读
- javascript - 如何减去这两个数组
- html - 如何用另一个属性的值替换一个属性值
- python - Python-Flask 无反应:活动一天后
- azure - 在 Azure 门户中,应用服务的模式是什么?
- javascript - 如何使用百分比随机获取数组中的元素来指定每个元素的可能性?
- c# - ASP.NET GridView 与标题列表
- php - Wordpress 永久链接更改后如何进行 301 重定向
- python - 将 DataFrame.sort_values 与来自 tkinter 条目的信息一起使用的问题
- plsql - ORACLE 18c XE (18.0.0.0.0) - MAX_STRING_SIZE = EXTENDED (COLLATE BINARY_CI) 问题
- php - php数组,过滤数组时出错且值不存在