Как я могу остановить определенного агента в Clojure? Когда их штаты собирают мусор? - PullRequest
6 голосов
/ 06 января 2011

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

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

1 Ответ

5 голосов
/ 06 января 2011

управление агентами как данными, а не потоками

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

Если вы привяжете к нему переменную верхнего уровня, она останется навсегда.

(def foo (agent {}))  

если вы свяжете его с именем в функции, это будет GCd в конце этой функции

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

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

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

(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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...