我正在与 Scala Actors 合作尝试实现一些调度程序算法。
调度程序接收两个函数,它们在计算过程中调用一些“交互”函数。例如:
def func1(x:Int, y:Int)(scheduler:MyScheduler):Int = {
var z = 0
if (scheduler.interact(1)) {
return 7
}
z = x * y
for (c <- 1 to 10) {
if (scheduler.interact(z)) {
return z
}
z = z * c
}
z
}
现在调度器需要顺序运行这两个函数,并且每当一个函数的执行到达“交互”时,调度器决定是让同一个函数继续还是暂停它并唤醒另一个函数计算。
你可以把它想象成运行 python 生成器,调度器决定每次调用哪个生成器的next() 。
我使用 Scala Actors 实现了这一点——每个函数都在一个actor中执行,并且interact
操作向主线程(调度程序)回复一些值并调用“receive”来等待来自主线程的消息。
请注意,我不能使用“react”而不是“receive”,因为我需要执行从接收块中断(并从“交互”函数返回)。
然后我想通过使用SingleThreadedScheduler让我的演员始终在主线程上运行来改进实现。
但是,似乎与“react”不同,“receive”函数尝试创建一个阻止执行的新线程。
在“react”和“receive”之间是否存在某些东西,其中执行会像“receive”一样离开块,但要避免像“react”那样创建新线程?或者也许我可以通过其他方式将线程数限制为 1?
A-Posteriori 我读过关于 scala continuations 的文章,但这需要太多的代码更改(你会同意 scala continuations 使用起来有点复杂......)。
谢谢