我正在玩一个模拟,其中我有几个机器人和一个控制器,控制器决定做什么并将工作分配给机器人,从技术上讲,以下是一种滥用,基本上我不关心代理状态,我只关心它的事实将按顺序执行发送给它的 fns,我可以等待它们完成。
以下几乎展示了我想要实现的目标,控制器得到了很大的工作,每个机器人都得到了一大块,
(def *agents* (reduce
(fn[h v] (assoc h v (agent true)))
{:control (agent true)} (range 0 5)))
(defn send-job [id f]
(send-off (*agents* id)
(fn [s f]
(try
(f)
(catch Exception e (println e))))
f))
(defn await-job [id]
(await (*agents* id)))
(send-job :control
(fn []
(send-job 0 (fn []
(Thread/sleep 10)
(println "0 Done.")))
(send-job 1 (fn []
(Thread/sleep 2)))
(await-job 1)
;; 0 still running.
;; do other stuff...
))
好吧,问题是你不能在送行中送行,我得到“不能在代理行动中等待”。是否可以使用 clojure 的并发工具来做到这一点,或者我是否必须重新实现类似结构的代理?