Clojureで特定のエージェントを停止するにはどうすればよいですか?彼らの州はいつゴミ収集されますか?

StackOverflow https://stackoverflow.com/questions/4609151

  •  25-09-2019
  •  | 
  •  

質問

エージェントが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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top