如果代理在Clojure的后台运行其队列,如何在不停止所有代理的情况下停止它?
当我完成一个代理并且我让它超出范围并且它完成了它的队列工作时,它是否与其最终状态一起被垃圾收集?
将代理管理为数据而非线程
代理是与线程池和事件队列相关联的数据结构.当事件可用于代理时,该池中的线程轮流在代理上工作,直到线程池变满或事件(工作)队列变空.当最后一次引用超出范围时,代理会被垃圾回收.
如果你将顶级var绑定到它,它将永远存在.
(def foo (agent {}))
Run Code Online (Sandbox Code Playgroud)
如果将它绑定到函数中的名称,它将在该函数的末尾处为GCd
(defn foo []
(let [foo (agent {})]
(send do-stuff foo)))
Run Code Online (Sandbox Code Playgroud)
我没有看到取消代理工作队列的直接消息,但您可以通过在代理上设置始终返回false的验证器来破解它.这可能导致代理停止工作并等待代理错误被清除.
如果要从创建代理程序的词法范围之外的代码中终止代理程序,则需要将代理程序存储在某个可变结构(如atom)中,以便可以删除对代理程序的引用以允许它为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
Run Code Online (Sandbox Code Playgroud)