正在使用clojure';s stm作为一个全球国家被认为是一种良好做法?
在我的大多数clojure程序中。。。我看到很多其他clojure程序,原子中有某种全局变量:正在使用clojure';s stm作为一个全球国家被认为是一种良好做法?,clojure,Clojure,在我的大多数clojure程序中。。。我看到很多其他clojure程序,原子中有某种全局变量: (def *program-state* (atom {:name "Program" :var1 1 :var2 "Another value"})) 在法典中偶尔会提到这种状态 (defn program-name [] (:name @*program-state*)) 阅读这篇文章让我重新思考全局状态,但不知何故,尽管我完全同意
(def *program-state*
(atom {:name "Program"
:var1 1
:var2 "Another value"}))
在法典中偶尔会提到这种状态
(defn program-name []
(:name @*program-state*))
阅读这篇文章让我重新思考全局状态,但不知何故,尽管我完全同意这篇文章,但我认为在atoms中使用哈希映射是可以的,因为它提供了一个通用的接口来操作全局状态数据(类似于使用不同的数据库来存储数据)
我想对这个问题有一些其他的想法。我认为拥有一个偶尔以交换方式更新的单一全局状态是很好的。当您开始有两个需要更新的全局状态,线程开始使用它们进行通信时,我开始担心了
- 保持当前全局用户的计数是可以的:
- 任何线程都可以在任何时候加入或删除该线程,而不会伤害其他线程
- 如果它从你的线下变出来,什么也不会爆炸
- 维护日志目录有问题:
- 当它更改时,所有线程是否都会停止向旧线程写入
- 如果两条线发生变化,它们将会聚在一起
- 将其用作消息队列更值得怀疑:
- 一致性-代码的一部分能否更改程序名?如果是这样,则从其他线程的角度来看,
函数的行为将不一致。不好李>程序名
- 可测试性-这容易测试吗?测试套件中更改程序名的一部分能否与读取程序名的另一个测试同时安全运行
- 多个实例-应用程序的两个不同部分是否希望同时使用不同的程序名?如果是这样,这是一个强烈的暗示,您的可变状态不应该是全局的
- 使用ref而不是atom,至少可以确保事务中可变状态的一致性
- 使用绑定可以将可变性限制在每个线程的基础上。这解决了大多数并发性问题,并且在全局变量像一组线程本地配置参数一样使用时会很有帮助
- 尽可能使用不可变全局状态。它真的需要是可变的吗