gestore agenti non dati filati
un agente è una struttura di dati associato a un pool di thread e una coda di eventi. quando gli eventi sono disponibili per gli agenti, i thread del pool eseguono a turno il lavoro sugli agenti fino a quando il pool di thread non si riempie o la coda di evento (di lavoro) diventa vuota. un agente è garbage collocato quando l'ultimo riferimento ad esso va fuori ambito.
se si associa un livello superiore ad esso esso rimarrà per sempre.
(def foo (agent {}))
se si associa a un nome in una funzione che sarà GCD alla fine di quella funzione
(defn foo []
(let [foo (agent {})]
(send do-stuff foo)))
non vedo un messaggio diretto per l'annullamento della coda di lavoro di un agente sebbene tu possa essere in grado di hackerare questo tramite impostando un validatore sull'agente che restituisce sempre false. Ciò potrebbe causare l'arresto dell'agente e attendere la cancellazione dell'errore dell'agente.
se si desidera eliminare un agente dal codice al di fuori dell'ambito lessicale in cui è stato creato l'agente, sarà necessario archiviare l'agente in una struttura mutevole come un atomo in modo da poter rimuovere il riferimento all'agente per consentirlo essere 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
fonte
2011-01-06 01:25:58