2011-01-05 2 views
6

エージェントがClojureのバックグラウンドでそのキューを使って作業している場合、どのエージェントを停止せずに停止させることができますか?Clojureで特定のエージェントを停止するにはどうすればよいですか?状態はいつガベージコレクションされますか?

エージェントが終了し、エージェントが終了してスコープから外れ、キューで作業が終了すると、最終状態とともにガベージコレクションされますか?

答えて

5

データではないスレッド

としてエージェントをエージェントを管理スレッドおよびイベントのキューのプールに関連付けられているデータ構造です。エージェントにイベントが利用可能になると、スレッドプールがいっぱいになるかイベント(作業)キューが空になるまで、そのプール内のスレッドはエージェント上で作業を交互に実行します。 エージェントは、最後の参照が有効範囲外になったときにガベージコレクトされます。

これに最上位レベルの変数をバインドすると、永遠に残ることになります。あなたが関数内で名前にバインドした場合

(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 
関連する問題