#clojure
#clojure
Вопрос:
Я пытаюсь разобраться в том, что происходит, когда агенты вызывают агентов.
(def top (agent 0))
(def bottom (agent 1))
У меня есть минимальная пара:
(defn testA []
"This returns 'top', whose value is 'bottom', whose value is 2."
(send top (fn [top-value]
(send bottom inc)))
(await top)
top)
(defn testB []
"This never terminates."
(send top (fn [top-value]
(send bottom inc)
(await bottom) ;;<- this is new
bottom))
(await top)
top)
Что происходит с внутренним ожиданием? Какие факторы вступают в игру, когда один агент вызывает другого?
Спасибо,
Ответ №1:
Короткий ответ таков: вы не можете использовать await
в действии агента. Вы можете увидеть ошибку (при выходе из текущего ожидания) с помощью (agent-error top)
Для получения более длинного ответа (объясняющего, почему вы не можете этого сделать) вам придется (а) подождать какого-нибудь гуру clojure 🙂 Я полагаю, что вы можете ввести взаимоблокировки или какую-либо другую катастрофу.
Также обратите внимание, что использование top
or bottom
возвращает сам агент, а не его значение. Чтобы получить значение, вам нужно (deref top)
или @top
для краткости.