我正在与斯卡拉演员尝试实施一些调度算法。斯卡拉演员 - 使用SingleThreadedScheduler与接收
调度程序接收两个函数,它们在计算过程中调用一些“交互”函数。例如:
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”之间有什么东西,其中执行离开块像“接收”,但避免创建一个新的线程,如“反应”? 或者我可以用其他方式将线程数限制为1?
A-Posteriori我读了关于scala延续,但这需要太多的代码更改(并且您会同意scala延续使用有点复杂...)。
感谢
嗨里克,抱歉把这作为一个评论,有没有一个专门的在线论坛或组jcsp? – user1125516