0

Scala中有没有办法在不阻塞整个流程的情况下循环执行某些内容?

我有以下代码在 Actor 模型中传输一些东西

所有演员向其他演员发送一些东西:

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

我也有一些代码来接收其他演员发送的内容。但是流程并没有脱离循环。它在不退出循环的情况下休眠并继续。因此,所有参与者都继续发送,但没有人接收。我怎样才能解决这个问题?

4

1 回答 1

1

如果我理解正确,您希望传输每 100 毫秒发生一次,但您不想为此创建另一个线程(并且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 回答