eventloop函数在Scala Actors中做什么?它有什么用处?
发布于 2011-06-12 03:14:51
eventloop的工作原理类似于loop和react的组合。loop和eventloop之间的区别在于,loop实际上并不递归地调用body (以防止基于线程的参与者的堆栈溢出),而是调度对来自邮箱的下一条消息的处理(反应/接收),并完成当前处理程序的执行,抛出一个异常,以清除调用堆栈。
eventloop使用react递归地处理消息-在react的情况下它是安全的(并且堆栈不会溢出),因为react的主体(而不是receive!)在大多数情况下,总是以异常结束,并安排下一个循环,以保证所有参与者对线程池的公平访问。因此,eventloop只能与事件驱动的参与者一起使用。
import scala.actors._
import Actor._
class EventLoop extends Actor {
def act = eventloop{
case msg => println("Received " + msg)
}
}发布于 2011-06-12 02:16:38
也许this thread可以给出一些细节:
actor的一个重要动机是,它们允许您避免控制反转,这意味着一次最多只有一个线程在actor内部执行,用户通过编写一个在控制流中显式点处等待消息的直线程序来选择何时执行。
在此模型中,人们通常希望避免将回调函数传递给异步调用它们的其他线程;相反,其他线程应该仅通过向参与者发送消息来与其交互。如果需要类似回调的行为,则使用以下模式以线程安全的方式实现::
def eventloop() {
react {
case Event1 =>
// handle Event1
eventloop()
...
case Eventn =>
// handle Eventn
eventloop()
} } 此模式是作为
Actor.eventloop中的抽象操作提供的:
import scala.actors.Actor._
eventloop {
case Event1 =>
// handle Event1
case Eventn =>
// handle Eventn
} 请注意,不再需要对某些封闭函数进行尾部调用。
话虽如此,考虑到这个帖子可以追溯到2008年,而Scala Actor API guide一次也没有提到eventloop,也许这个词并不经常使用。
Vasil Remeniuk熟练地详细介绍了eventloop在his answer (+1)中的用法,并在问题"Client-Server example with Scala actors“中给出了一个具体的例子。
https://stackoverflow.com/questions/6317053
复制相似问题