Я использую агентов для управления структурой, но у меня нет всех моих побочных эффектов.
Все сообщения отправлены (я их распечатал и посчитал), но бывают случаи, когда у меня не хватает всех побочных эффектов. Как будто не все мои функции были применены к состоянию агента, или если последняя отправка была применена к предыдущему состоянию ..
Я экспериментировал с doall, dorun, но не нашел решения, благодарю за любую помощь.
;; aux function for adding an element to a hashmap
(defn extend-regs [reg s o]
(let [os (get reg s)]
(if (nil? os)
(assoc reg s [o])
(assoc reg s (conj os o)))))
;; the agent's altering function - adding an element to the :regs field(a hashmap)
(defn add-reg! [d s o]
(send d (fn [a] (assoc a :regs (extend-regs (:regs a) s o)))))
;; Creating the agents, dct/init returns an agent
;; pds: data for fields
(defn pdcts->init-dcts! [pds]
(doall (map dct/init (map :nam pds) (repeat nil))))
;; Altering one agent's state, dct/add-reg sends an assoc message to the agent
;; d: agent, pd: data for fields
(defn dct->add-regs! [d pd]
(dorun (map (fn [s r] (dct/add-reg! d s r))
(:syms pd)
(:regs pd)))
d)
;; Going through all agents
;; ds: agents, pds: datas
(defn dcts->add-regs! [ds pds]
(dorun (map (fn [d pd] (dct->add-regs! d pd))
ds
pds))
ds)
РЕДАКТИРОВАТЬ: =================================================== ========
Хорошо, оказалось, что я просто не дождался, пока мои потоки завершат свои задачи. Теперь вопрос в том, как я могу контролировать своих агентов. Как я могу узнать, что в очереди есть незавершенные темы? Я нашел только swank.core / active-threads и подобные, но они не являются решением.