0

フロー全体をブロックせずにループで何かを実行する方法はScalaにありますか?

アクターモデルで何かを送信するための次のコードがあります

すべてのアクターは他のアクターに何かを送信します。

def some_method
  loop {
  // Transmit something
  Thread.sleep(100)
}

他のアクターが送信するものを受信するためのコードもあります。しかし、フローはループから出ていません。ループから抜け出すことなくスリープして続行します。したがって、すべてのアクターは送信を続けますが、誰も受信しません。どうすればこれを修正できますか?

4

1 に答える 1

1

私があなたを正しく理解しているなら、あなたは送信が100msごとに発生することを望みますが、そのために別のスレッドを作成することは望まないでしょう(そしてThread.sleepアクターの内部は実際にフローをブロックするかもしれません)。あなたが使用することができますreactWithin

import java.util.Date
import math.max

def some_method = {
    var last_transmission_time = 0
    loop {
        val current_time = (new Date).getTime
        reactWithin(max(0, last_transmission_time + 100 - current_time)) {
            // actor reaction cases

            case TIMEOUT => {
                // Transmit something
                last_transmission_time = (new Date).getTime
            }
        }
    }
}

last_transmission_time送信が最後に行われたときに保存されます。反応タイムアウトは、現在時刻が最終送信時間+100msのときにTIMEOUTが発生するように計算されます。

タイムアウトが発生した場合は、最後の送信から100ミリ秒以上経過したことを意味するため、別の送信を呼び出す必要があります。

反応ケース自体に時間がかかる場合は、簡単な解決策はありませんが、別のスレッドを作成します。

私はあなたの問題を完全に理解しているかどうかわからないので、コードを試しませんでした。

于 2012-09-30T23:32:17.623 に答える