Scala中有没有办法在不阻塞整个流程的情况下循环执行某些内容?
我有以下代码在 Actor 模型中传输一些东西
所有演员向其他演员发送一些东西:
def some_method
loop {
// Transmit something
Thread.sleep(100)
}
我也有一些代码来接收其他演员发送的内容。但是流程并没有脱离循环。它在不退出循环的情况下休眠并继续。因此,所有参与者都继续发送,但没有人接收。我怎样才能解决这个问题?
Scala中有没有办法在不阻塞整个流程的情况下循环执行某些内容?
我有以下代码在 Actor 模型中传输一些东西
所有演员向其他演员发送一些东西:
def some_method
loop {
// Transmit something
Thread.sleep(100)
}
我也有一些代码来接收其他演员发送的内容。但是流程并没有脱离循环。它在不退出循环的情况下休眠并继续。因此,所有参与者都继续发送,但没有人接收。我怎样才能解决这个问题?
如果我理解正确,您希望传输每 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 毫秒,因此应调用另一次传输。
如果反应案例本身可能需要很多时间,那么我看不到任何简单的解决方案,而是创建另一个线程。
我没有尝试代码,因为我不确定我是否完全理解您的问题。