2012-10-07 33 views
0

我正在与斯卡拉演员尝试实施一些调度算法。斯卡拉演员 - 使用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延续使用有点复杂...)。

感谢

回答

0

这种挑战的证据表明,角色模型并不总是正确的抽象。正如你所说的,延续通常会使事情变得更加复杂,对于那些阅读代码的人来说,甚至可能更加模糊。

我自己的选择是找到一种方式来清楚地说明线程实际将要做什么。幸运的是,这可以使用优秀的JCSP API(来自UKC)。尽管这是一个Java API,但它在Scala中也可以正常工作,并且已经成熟稳定(有一个Oxford Uni pure Scala项目,但这可能还不成熟)。 JCSP实现了Hoare的CSP,这是一个数学代数,但一旦你意识到它是事件驱动的,它很容易使用。演员可以很容易地在JCSP中建模,但反之亦然。

在您的应用程序中,您的调度程序将拥有自己的CS进程(又名Java线程),并将根据收到的事件确定自己的状态和生命周期。这允许它依次调用这两个函数,而不是同时重叠,而是成为更广泛的线程活动的一部分。

http://www.cs.kent.ac.uk/projects/ofa/jcsp/提供了背景材料。罐子在http://mvnrepository.com/artifact/org.codehaus.jcsp/jcsp

+0

嗨里克,抱歉把这作为一个评论,有没有一个专门的在线论坛或组jcsp? – user1125516