我正在尝试编写非常简单的代码,它在Clojure中显示了commute和alter之间的不同结果。有人可以为此目的创建一个例子吗?
更容易理解差异。
答案 0 :(得分:1)
假设commute
被正确使用,Refs的观察值应该没有区别,除非使用commute
可能有助于在高争用场景中提交事务很难使用alter
执行此操作。当然,当这适用时,结果是一个相当显着的差异......
使用副作用更准确地说明事物的不同之处。这是一个单线程示例,用于说明
的基本属性 alter
将被调用一次(可能只有一次),
commute
将被调用一次(虽然commute
不会导致它们,但如果在同一个alter
块中使用dosync
,则可能会涉及重试,然后最后一次计算已提交的值(至少如此)两次,但再次,它不会导致自己重试):
user=> (def r (ref nil))
#'user/r
user=> (dosync (alter r prn))
nil
nil
user=> (dosync (commute r prn))
nil
nil
nil
使用一些Thread/sleep
和一些线程,可以在alter
方面引发更多重试,同时仍然在commute
侧观察两次重试,调查对Ref历史的影响使用一个或另一个等。