2013-06-21 36 views
3

考虑下面的代码:Clojure:代理调用代理:怀疑是死锁?

(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) 
) 

使用Send /欢送的任意组合,我不能有从代理运行。 但是,当我运行古典java.lang.Thread中的运行主,一切工作正常。

有没有人有想法。

谢谢

问候

J-Ç

回答

2

send在代理操作(或交易)的持有至到期的动作(或交易)completted(并承诺)。然而,你的运行主人永远不会返回。所以你只需要累积send-off这些实际上从未提交执行的请求。尝试这样的:

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

我不明白你的意思。发送使用的工作者池是无限的。因此,问题中的示例代码将正常工作,因为只有一个线程(运行run-master动作)将从'send-off'线程池中保持线程。每当我们使用'send-off'函数时,我们知道动作执行可以被阻止,这并不是不正确的或意外的行为。 – hsestupin

+0

所以我明白Kotarak的解释是正确的?在阅读文档后,我完全不理解发送/发送的预期行为。谢谢你们的帮助! – jcmincke

+0

@hsestupin关键是''send'不会立即发生在代理行为中。它被推迟到动作完成。当这种事情永远不会发生...那么发送永远不会发生 – kotarak