Агенты, вызывающие агентов

#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 для краткости.