我有一系列功能(如some-operation
示例中的),我send
或send-off
代理:
(defn some-operation [agent-state]
(dosync
(let [updated (foo agent-state)] ;; derive new state from old one
(alter bar whatev updated) ;; reflect the new state in the world
(send *agent* some-operation) ;; "recur"
updated) ;; value for recur
))
(send (agent {}) some-operation)
当我开发我的应用程序时,这种方法对我很有效。但是在代码库中进行一些更改后,代理会在一段时间后停止运行(“一段时间”是几秒钟 - 几千次“递归”调用)。
他们的状态在域中是有效的,代理本身没有FAILED
,而且我确信他们没有在他们的dosync
块上活锁(可以衡量争用)。
我的怀疑是 JVM/OS 正在阻止底层执行程序线程运行,出于某种或其他原因。但我不知道如何检查这个假设是否正确。
一般来说,发送代理可能无法执行其挂起的“发送”的一些可能原因是什么?我可以检查/测量什么?
更新- 给定以下调试修改...
(defn some-operation [agent-state]
(let [f (future
(dosync
...) ;; the whole operation, as per the previous example
)]
(Thread/sleep 1000) ;; give the operation some time
(if (realized? f)
@f
;; not realized: we deem the operation as blocking indefinetely
(do
(println :failed)
(send *agent* some-operation)
agent-state))))
...代理仍然卡住,甚至不打印:failed
。