6

エージェントがClojureのバックグラウンドでキューを処理している場合、すべてのエージェントを停止せずにエージェントを停止するにはどうすればよいですか?

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

4

1 に答える 1

6

エージェントをスレッドではなくデータとして管理する

エージェントは、スレッドのプールとイベントのキューに関連付けられているデータ構造です。エージェントがイベントを利用できる場合、そのプール内のスレッドは、スレッドプールがいっぱいになるか、イベント(作業)キューが空になるまで、エージェントで順番に作業を行います。エージェントへの最後の参照がスコープ外になると、エージェントはガベージコレクションされます。

トップレベルの変数をそれにバインドすると、永久に残ります。

(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
于 2011-01-06T01:25:58.440 に答える