2011-07-21 10 views
3

私は30秒ごとに更新されるref状態を持っているといい、fnは完了するまでに時間がかかるかもしれないということに気づいています。時刻0 refが更新され、時刻30にfnが呼び出されると、refは再び更新されますが、fnはまだ実行されています。私は同じ関数の2つのコピーを実行しているのですか?それとも、fnがそれを返すと仮定して、時間60でスキップして実行しますか?Clojure refsとadd-watch

編集:refの状態を変更しようとしています。それは私がちょうどいくつかのコントロール計算を行うためのトリガーとしてそれを使用しようとしている他の場所で更新されています。

答えて

1

refを使用すると、2つの関数が並行して実行され、refを次の状態に戻すために競合します。

これは、refとエージェントの違いの1つです。エージェントは実行待ちのキューを持つため、順次実行されます。

+1

fnはrefを変更しません。それは実際にはrefに基づいていくつかの計算を行います。それは文字の束を制御する世界の状態に基づいています。私が望まないのは、文字を修正しようとする2つの関数です。 –

+0

refを使用すると(最初の点のように)、探している結果が得られない可能性があります。エージェントに時計を追加することは、あなたが望むものにもっと近づくはずです。 –

+0

refを使用する必要がある場合は、更新機能をエージェントに送信するウォッチを追加することができます。そうすれば更新機能は余分な時間と呼ばれることはありません。 –