Mi sto trastullando con una simulazione in cui ho un paio di robot e un controller, il controller ha deciso cosa fare e assegnare i lavori ai robot, in seguito è tecnicamente un abuso fondamentalmente non mi interessa lo stato degli agenti, Mi interessa solo il fatto che eseguirà i fns inviati in ordine e posso aspettare che finiscano.Uso degli agenti per sincronizzare i lavori
seguito praticamente dimostra quello che sto cercando di realizzare, controllore ottiene un grande lavoro ogni robot ottiene un pezzo di esso,
(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...
))
Bene il problema è che non è possibile inviare-off all'interno di un Invia- fuori ricevo "Non posso aspettare in azione agente". È possibile farlo usando gli strumenti di concorrenza di clojure o devo implementare nuovamente una struttura come agente?