Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency 使用代理同步作业_Concurrency_Clojure_Agent - Fatal编程技术网

Concurrency 使用代理同步作业

Concurrency 使用代理同步作业,concurrency,clojure,agent,Concurrency,Clojure,Agent,我在玩一个模拟,我有两个机器人和一个控制器,控制器决定做什么并给机器人分配任务,下面是一个技术上的滥用基本上我不关心代理的状态,我只关心它将按顺序执行发送给它的FN,我可以等待它们完成 下面的内容很好地说明了我想要实现的目标,控制器得到了一个大任务,每个机器人都得到了一大块 (def *agents* (reduce (fn[h v] (assoc h v (agent true))) {:control (agent true)}

我在玩一个模拟,我有两个机器人和一个控制器,控制器决定做什么并给机器人分配任务,下面是一个技术上的滥用基本上我不关心代理的状态,我只关心它将按顺序执行发送给它的FN,我可以等待它们完成

下面的内容很好地说明了我想要实现的目标,控制器得到了一个大任务,每个机器人都得到了一大块


(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将更好地为您服务

同样令人感兴趣的可能是框架,它基本上是关于在进行计算的过程中分出小的计算单元,并(可能)在需要结果的时候等待它们