Как я могу остановить конкретный агент в Clojure? Когда их государства собирают мусор?

StackOverflow https://stackoverflow.com/questions/4609151

  •  25-09-2019
  •  | 
  •  

Вопрос

Если агент работает через очередь в фоновом режиме в Clojure, как я могу остановить его, не останавливая все агенты?

Когда я закончу с агентом, и я позволил ему выпасть из прицела, и он заканчивает работу над своей очередью, это мусор, собранный вместе с его последним государством?

Это было полезно?

Решение

Управление агентами как данные не темы

Агент является Структура данных, связанная с пулом нитей и очередь событий. Когда события доступны для агентов, то потоки в этом пуле по очереди выполняют работу над агентами до тех пор, пока пул резьбы не получится или событие (рабочая) очередь становится пустым. Агент является мусором, собранным, когда последняя ссылка на него выходит из неисправности.

Если вы связываете верхний уровень VAR, он будет придерживаться навсегда.

(def foo (agent {}))  

Если вы связываете его с именем в функции, он будет GCD в конце этой функции

(defn foo [] 
  (let [foo (agent {})] 
    (send do-stuff foo))) 

Я не вижу прямое сообщение для отмены рабочей очереди агента, хотя вы можете взломать это Установка валидатора на агент, который всегда возвращает false. Отказ Это может привести к тому, чтобы агент перестать работать и дождаться очищенной ошибки агента.

Если вы хотите убить агента из кода за пределами лексического применения, в котором был создан агент, вам нужно будет хранить агент в некоторой мультименной структуре, такой как атом, чтобы вы могли удалить ссылку на агент, чтобы позволить ему быть GCD.

(def my-agent (atom nil))         ;a persistent name for a transient agent

(swap! my-agent (make-new-agent)) ;create the agent

(send do-stuff @my-agent)         ;use the agent

(swap! my-agent nil)              ;clean up
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top