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