gpt4 book ai didi

clojure - 如何停止 Clojure 中的特定代理?他们的州什么时候收集垃圾?

转载 作者:行者123 更新时间:2023-12-04 15:15:35 24 4
gpt4 key购买 nike

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

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

最佳答案

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

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

如果您将顶级 var 绑定(bind)到它,它将永远存在。

(def foo (agent {}))  

如果将它绑定(bind)到函数中的名称,它将在该函数的末尾被 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

关于clojure - 如何停止 Clojure 中的特定代理?他们的州什么时候收集垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4609151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com