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