Clojure代理交互失败

时间:2011-05-12 08:03:17

标签: clojure agent

想象一下:平坦的世界n * n细胞。有移动的物体。它们可以相互碰撞,并且根据过程中的一个应该被摧毁。

我使用来自Rich Hickey的蚁群的想法将对象表示为代理。因此,在碰撞之后,代理人必须在收到其他代理人的消息后停止工作。

有一个代码片段来说明我的问题:第二个代理意外停止。

;agents
(def f_guy (agent nil))

(def s_guy (agent nil))

;functions for agents
(defn f_do [x]
  (do
    (Thread/sleep 20)
    (println "f")
    (send-off *agent* f_do)))

(defn s_do [x]
  (do
    (Thread/sleep 40)
    (println "s")
    (send-off f_guy nil)
    (send-off *agent* s_do)))

;the process
(defn start []
  (do
    (send-off f_guy f_do)
    (send-off s_guy s_do)))

;go
(start)

谢谢!

2 个答案:

答案 0 :(得分:2)

您向f_guy发送了一个请求,要求nil作为一项功能。他做了,并且通过抛出一个例外让他陷入了破碎状态。然后,你让他再次打电话给nil。但他甚至不能同意这样做,因为他已经破碎并等待有人来修理他。因此,s_guy正在等待f_guy确认(不一定执行)请求,并且f_guy已经暂停了当天。

答案 1 :(得分:1)

我可以问你在这里想要完成什么?

我的实验中第一个和第二个代理都失败了,因为你基本上是将代理放在代理内部的代理中......

示例:

(def a (agent 0))
(send-off a inc) ; -> #<Agent@29de03: 1>

通过这样做:

(defn f_do [x]
  (do
    ...
    (send-off *agent* f_do)))

您在代理内递归返回代理。