非阻塞scala循环

非阻塞scala循环,scala,loops,actor,nonblocking,Scala,Loops,Actor,Nonblocking,Scala中有没有一种方法可以在循环中执行某些内容而不阻塞整个流程 我有下面的代码在Actor模型中传输一些东西 所有演员都会向其他演员发送: def some_method loop { // Transmit something Thread.sleep(100) } 我也有一些代码来接收其他演员发送的内容。但这种流动并不是从循环中出来的。它会休眠并继续,但不会退出循环。因此,所有参与者都在不断发送,但没有人接收。如何修复此问题?如果我理解正确,您希望每100ms传输一次,但不

Scala中有没有一种方法可以在循环中执行某些内容而不阻塞整个流程

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

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

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

我也有一些代码来接收其他演员发送的内容。但这种流动并不是从循环中出来的。它会休眠并继续,但不会退出循环。因此,所有参与者都在不断发送,但没有人接收。如何修复此问题?

如果我理解正确,您希望每100ms传输一次,但不希望为此创建另一个线程(以及
线程。演员内部的睡眠可能确实会阻止流)。
您可以在
中使用

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\u transmission\u time
保存上次完成传输的时间。 计算反应超时,以便在当前时间为最后一次传输时间+100ms时发生超时

如果发生超时,则表示自上次传输以来已超过100毫秒,因此应调用另一次传输

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


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

将方法重构为参与者?