我正在尝试编写非常简单的代码,在 Clojure 中显示 commute 和 alter 之间的不同结果。有人可以为此创建示例吗?
越简单越好理解差异。
最佳答案
假设commute
如果使用正确,Refs 的观察值应该没有差异,除非使用 commute
可能有助于在竞争激烈的情况下提交事务,而使用 alter
很难做到这一点。 .当然,当这适用时,结果会有相当大的差异......
使用副作用更容易准确地说明事情有何不同。这是一个单线程示例来说明基本属性
alter
每次“交易尝试”将被调用一次(可能只有一次),commute
每次“事务尝试”将被调用一次(虽然commute
不会导致它们,如果alter
在同一dosync
block 中使用,则可能涉及重试),然后最后一次计算提交值(所以至少两次,但它自己不会导致重试):
user=> (def r (ref nil))
#'user/r
user=> (dosync (alter r prn))
nil
nil
user=> (dosync (commute r prn))
nil
nil
nil
使用一些 Thread/sleep
s 和少数线程可能会在 alter
上引发更多重试边,同时仍在 commute
上观察两次重试一边,调查使用其中一个等对 Ref history 的影响。
关于concurrency - Clojure 中的 commute 和 alter 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37426524/