Использование агентов для синхронизации заданий

Я играю с симуляцией, в которой у меня есть пара роботов и контроллер, контроллер решил, что делать и назначить задания роботам, это технически злоупотребление, в основном меня не волнует агенты заявляют, что меня просто волнует тот факт, что он выполнит отправленные ему команды 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 или мне нужно заново реализовать структуру, подобную агенту?

6
задан Hamza Yerlikaya 14 August 2011 в 10:19
поделиться