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