Clojureで特定のエージェントを停止するにはどうすればよいですか?彼らの州はいつゴミ収集されますか?
質問
エージェントがClojureのバックグラウンドでキューを介して作業している場合、すべてのエージェントを停止せずに停止するにはどうすればよいですか?
私がエージェントを終えて、それを範囲から脱落させ、それがキューの作業を終了したとき、それは最終状態とともに集められたゴミですか?
解決
エージェントをスレッドではなくデータとして管理します
エージェントはaです スレッドのプールに関連付けられているデータ構造 イベントのキュー。エージェントがイベントを利用できる場合、そのプールのスレッドは、スレッドプールがいっぱいになるか、イベント(作業)キューが空になるまでエージェントで作業を行います。エージェントは、最後の参照が範囲外に出るときに収集されたゴミです。
トップレベルの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
所属していません StackOverflow