clojure - 如何找出 Clojure 代理进入无效状态的原因

标签 clojure agent

Clojure 允许使用 set-validator! 根据某些规则检查代理的新状态是否有效。我的验证器发现由于某种原因代理的值被设置为 nil 的情况。但是,我不知道这是怎么发生的——是否有某种方法可以查明试图设置无效状态的操作?

最佳答案

代理也可以使用 watches ,因此向记录所有状态转换的代理添加观察者是非常合理的,这样当出现问题时,您可以使用此日志重播导致失败的转换(并希望由此产生问题)

user> (def x (agent 0))
#'user/x
user> (def states (atom []))
#'user/states
user> (add-watch x :state-logger (fn [& change] (swap! states conj change)))
#<Agent@1dff7647: 0>
user> (send x inc)
#<Agent@1dff7647: 0>
user> (send x dec)
#<Agent@1dff7647: 0>
user> (send x inc)
#<Agent@1dff7647: 1>
user> @states
[(:state-logger #<Agent@1dff7647: 1> 0 1) 
 (:state-logger #<Agent@1dff7647: 1> 1 0) 
 (:state-logger #<Agent@1dff7647: 1> 0 1)]

(take 200 ...) 放入 watcher 中可能是明智的,因此您只保留合理数量的状态(或使用环形缓冲区)

关于clojure - 如何找出 Clojure 代理进入无效状态的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25852979/

相关文章:

TeamCity - 存在未满足的要求 : DotNetFramework4. 5_x86

clojure - 在 Clojure 中将字符串转换为日期

algorithm - 我应该/可以在此函数中使用 `assoc` 来重新定义函数参数吗?

ios - PerformSegueWithIdentifier 不起作用

java - 如何将参数从 Main 提供给 Anylogic 中的代理

php - 为 iFrame 设置用户代理

java - VM 启动后启动 Instrumentation Agent

clojure - 在 Clojure 中声明匿名函数是否很昂贵?

tomcat - IntelliJ + Maven + Tomcat 中的 Clojure Webapp

regex - 匹配 Compojure/Clout 中的路线