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