Concurrency 使用代理同步作业
我在玩一个模拟,我有两个机器人和一个控制器,控制器决定做什么并给机器人分配任务,下面是一个技术上的滥用基本上我不关心代理的状态,我只关心它将按顺序执行发送给它的FN,我可以等待它们完成 下面的内容很好地说明了我想要实现的目标,控制器得到了一个大任务,每个机器人都得到了一大块Concurrency 使用代理同步作业,concurrency,clojure,agent,Concurrency,Clojure,Agent,我在玩一个模拟,我有两个机器人和一个控制器,控制器决定做什么并给机器人分配任务,下面是一个技术上的滥用基本上我不关心代理的状态,我只关心它将按顺序执行发送给它的FN,我可以等待它们完成 下面的内容很好地说明了我想要实现的目标,控制器得到了一个大任务,每个机器人都得到了一大块 (def *agents* (reduce (fn[h v] (assoc h v (agent true))) {:control (agent true)}
(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的并发工具执行此操作,或者我是否必须重新实现类似代理的结构?您可以在代理操作中发送或发送所有您喜欢的操作 事实上,你不能做的是等待另一个代理从代理内部完成。就像短信上说的 这是一件好事,因为允许在代理中等待显然会导致可能的死锁。clojure并发原语的要点是,如果您遵守规则,就不可能出现死锁(以及其他与并发相关的问题) 在我看来,您的用例对于代理来说并不理想。它们是一个异步同步点,类似于actors的
收件箱队列
部分。由于您不需要这种功能,并且将它们仅仅用作工作人员,因此我认为使用普通Java将更好地为您服务
同样令人感兴趣的可能是框架,它基本上是关于在进行计算的过程中分出小的计算单元,并(可能)在需要结果的时候等待它们