函数“eventloop”在Scala Actors中的作用是什么?

时间:2011-06-11 16:18:28

标签: scala actor

函数eventloop在Scala Actors中的作用是什么?它对什么有用?

2 个答案:

答案 0 :(得分:9)

eventloop的工作方式类似于loopreactloopeventloop之间的区别在于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”中提供了具体示例。