エージェントがClojureのバックグラウンドでキューを処理している場合、すべてのエージェントを停止せずにエージェントを停止するにはどうすればよいですか?
エージェントの処理が終了し、スコープから外れ、キューでの作業が終了した場合、最終状態とともにガベージコレクションされますか?
エージェントをスレッドではなくデータとして管理する
エージェントは、スレッドのプールとイベントのキューに関連付けられているデータ構造です。エージェントがイベントを利用できる場合、そのプール内のスレッドは、スレッドプールがいっぱいになるか、イベント(作業)キューが空になるまで、エージェントで順番に作業を行います。エージェントへの最後の参照がスコープ外になると、エージェントはガベージコレクションされます。
トップレベルの変数をそれにバインドすると、永久に残ります。
(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