如何解决Scala Actors中的“ eventloop”函数有什么作用?
|eventloop
函数在Scala Actors中起什么作用,它有什么用?
解决方法
eventloop
的工作方式与loop
和react
的组合相似。 loop
和eventloop
之间的区别在于,loop
实际上不会递归调用主体(以防止基于线程的actor发生堆栈溢出),而是安排处理(反应/接收)邮箱中的下一条消息,并且完成抛出异常的当前处理程序的执行,以清除调用堆栈。
eventloop
使用react
递归处理消息-在react
的情况下,它是安全的(并且堆栈不会溢出),因为ѭ3body的主体(但不是receive
!)总是以异常结尾,在大多数情况下,并计划下一个循环,以确保所有参与者都能公平地访问线程池。因此,eventloop
仅可用于事件驱动的actor。
import scala.actors._
import Actor._
class EventLoop extends Actor {
def act = eventloop{
case msg => println(\"Received \" + msg)
}
}
, 也许这个线程可以给出一些细节:
演员的一个重要动机是他们允许您
避免控制反转,这意味着最多有一个线程
一次在演员内部执行,用户选择何时
通过编写等待的直线程序来实现
控制流中显式点的消息。
在这种模型中,通常希望避免将回调函数传递给其他异步调用它们的线程。相反,其他线程应仅通过向参与者发送消息来与参与者交互。如果需要类似回调的行为,则可以通过以下模式实现
以线程安全的方式:
def eventloop() {
react {
case Event1 =>
// handle Event1
eventloop()
...
case Eventn =>
// handle Eventn
eventloop()
} }
此模式在ѭ15中作为抽象操作提供:
import scala.actors.Actor._
eventloop {
case Event1 =>
// handle Event1
case Eventn =>
// handle Eventn
}
请注意,不再需要对某些封闭函数进行尾部调用。
话虽如此,考虑到线程的日期是2008年,并且Scala Actor API指南没有一次提到“ 0”,也许这不是经常使用。
Vasil Remeniuk在回答(+1)中熟练地详细说明了“ 0”的用法,并在问题“带有Scala actors的客户端-服务器示例”中给出了具体示例。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。