【问题标题】:Clojure: Agent calling Agent: suspicion of deadlock?Clojure:代理调用代理:怀疑死锁?
【发布时间】:2013-06-18 09:22:23
【问题描述】:

考虑以下代码:

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

【问题讨论】:

    标签: concurrency clojure deadlock agent


    【解决方案1】:

    send 在代理操作(或事务)中被保留,直到操作(或事务)完成(并提交)。但是,您的 run-master 永远不会返回。因此,您只需累积 send-off 请求,这些请求实际上从未提交执行。试试这样的:

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

    【讨论】:

    • 我不明白你的意思。发送使用的工作池是无限的。所以问题中的示例代码可以正常工作,因为只有一个线程(运行 run-master 操作)将持有来自send-off 线程池的线程。每次我们使用send-off 函数时,我们都知道动作执行可能会阻塞,这不是不正确或意外的行为。
    • 所以我明白Kotarak的解释是正确的?阅读文档后,我根本不理解发送/发送的预期行为。谢谢你们的帮助!
    • @hsestupin 重点是send 不会在代理操作中立即发生。它会延迟到操作完成。如果这永远不会发生......那么发送永远不会发生。
    • @jcmincke 请参阅agent docs 中的要点 5。这正是您遇到的“问题”。
    • @kotarak 对不起,你是对的!不知道代理文档中的第 5 点。这让我明白了很多。
    猜你喜欢
    • 2012-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多