Clojure:代理呼叫代理:怀疑死锁?

时间:2013-06-21 09:34:28

标签: concurrency clojure deadlock agent

请考虑以下代码:

(let 
  [slave-agent (agent 0)
   run-slave (fn [_] (println "running slave agent"))
   run-master (fn [_]
            (loop []
              (println "sending to slave agent")
              (send-off slave-agent run-slave)
              (Thread/sleep 1000)
              (recur)
              )
            )
   master-agent (agent nil)
   ]
   (send-off master-agent run-master)  
  )

使用发送/发送的任意组合,我无法运行从属代理。 但是当我在经典的java.lang.Thread中运行run-master时,一切正常。

有没有人有想法。

谢谢

此致

J-ç

1 个答案:

答案 0 :(得分:2)

代理操作(或事务)中的

send一直持续到动作(或事务)完成(并且已提交)。但是你的run-master永远不会返回。因此,您只需累积send-off个实际上从未提交执行的请求。尝试这样的事情:

(defn run-master
  [_]
  (send-off slave-agent run-slave)
  (send-off *agent* run-master)
  (Thread/sleep 1000))