6

如果代理在 Clojure 的后台处理其队列,我如何在不停止所有代理的情况下停止它?

当我完成一个代理并且我让它超出范围并且它完成了它的队列工作时,它是否与它的最终状态一起被垃圾收集?

4

1 回答 1

6

将代理作为数据而不是线程来管理

代理是与线程池和事件队列相关联的数据结构。当事件可用于代理时,该池中的线程轮流在代理上工作,直到线程池变满或事件(工作)队列变空。当对代理的最后一次引用超出范围时,它会被垃圾回收。

如果您将顶级 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
于 2011-01-06T01:25:58.440 回答