非阻塞scala循环

时间:2012-09-30 20:01:55

标签: scala loops actor nonblocking

Scala中是否有办法在循环中执行某些操作而不会阻塞整个流程?

我有以下代码在Actor模型中传输内容

所有演员都会向其他演员发送内容:

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

我还有一些代码可以接收其他演员发送的内容。但是流程并没有从循环中流出。它会在没有退出循环的情况下休眠并继续。因此,所有演员都继续发送,但没有人收到。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你希望传输每100毫秒发生一次,但你不想为此创建另一个线程(并且一个actor内的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毫秒,因此应调用另一个传输。

如果反应案例本身可能需要花费很多时间,那么我看不到任何简单的解决方案,而是创建另一个线程。

我没有尝试代码,因为我不确定我是否完全理解您的问题。