函数eventloop
在Scala Actors中的作用是什么?它对什么有用?
答案 0 :(得分:9)
eventloop
的工作方式类似于loop
和react
。 loop
和eventloop
之间的区别在于loop
实际上并不是递归地调用正文(以防止基于线程的actor的堆栈溢出),而是调度处理(反应/收到来自邮箱的下一条消息,并完成执行抛出异常的当前处理程序,以清除调用堆栈。
eventloop
使用react
递归处理消息 - 如果react
它是安全的(并且堆栈不会溢出),因为react
的正文(但是not receive
!)总是以异常结束,在大多数情况下,以及下一个循环调度,以保证所有actor的公平访问线程池。因此,eventloop
只能用于事件驱动的actor。
import scala.actors._
import Actor._
class EventLoop extends Actor {
def act = eventloop{
case msg => println("Received " + msg)
}
}
答案 1 :(得分:3)
也许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熟练地详述了his answer (+1)中eventloop
的使用情况,并在问题“Client-Server example with Scala actors”中提供了具体示例。