エージェントがClojureのバックグラウンドでそのキューを使って作業している場合、どのエージェントを停止せずに停止させることができますか?Clojureで特定のエージェントを停止するにはどうすればよいですか?状態はいつガベージコレクションされますか?
エージェントが終了し、エージェントが終了してスコープから外れ、キューで作業が終了すると、最終状態とともにガベージコレクションされますか?
エージェントがClojureのバックグラウンドでそのキューを使って作業している場合、どのエージェントを停止せずに停止させることができますか?Clojureで特定のエージェントを停止するにはどうすればよいですか?状態はいつガベージコレクションされますか?
エージェントが終了し、エージェントが終了してスコープから外れ、キューで作業が終了すると、最終状態とともにガベージコレクションされますか?
データではないスレッド
としてエージェントをエージェントを管理スレッドおよびイベントのキューのプールに関連付けられているデータ構造です。エージェントにイベントが利用可能になると、スレッドプールがいっぱいになるかイベント(作業)キューが空になるまで、そのプール内のスレッドはエージェント上で作業を交互に実行します。 エージェントは、最後の参照が有効範囲外になったときにガベージコレクトされます。
これに最上位レベルの変数をバインドすると、永遠に残ることになります。あなたが関数内で名前にバインドした場合
(def foo (agent {}))
は、私が、エージェントの作業キューを解除するための直接的なメッセージが表示されない、その関数
(defn foo []
(let [foo (agent {})]
(send do-stuff foo)))
の終わりにGCDされますエージェントで常に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