现在我想要一个演员向其他演员发送消息,同时接收来自其他人的消息。看来我需要在Akka中使用多线程。以下是我的代码:
def receive = {
case Rumor => {
count+=1;
if ...
else self ! Sleep(FiniteDuration(20, "millis"))
}
case Sleep(duration) => {
case object WakeUp
context.system.scheduler.scheduleOnce(duration, self, WakeUp)
context.become(
{
case WakeUp => context.unbecome()
others ! Rumor
}, discardOld = false
)
}
case _=> .....
}
我的问题是:
1)我不确定我的代码是否会按预期工作。参考 use Akka scheduler inside an actor
2)我已导入
import scala.math._
import akka.actor._
import scala.util.Random
import scala.concurrent.duration._
但编译器仍然报告错误:
error: Cannot find an implicit ExecutionContext, either require one yourself or import ExecutionContext.Implicits.global
context.system.scheduler.scheduleOnce(duration, self, WakeUp)
答案 0 :(得分:18)
你做错了。 Actors专门用于消除手动线程管理引起的大多数问题。其中一个功能是演员始终按顺序工作。您无法强制玩家一次处理多条消息。 Akka甚至提供了关于消息及其顺序的若干保证。如果你不做任何愚蠢的事情,比如使用可变消息或直接调用其他actor对象,这允许完全线程安全。
当然,你可以在不同的线程中运行不同的actor(使用正确的调度程序),他们真的会并行处理他们的消息。但无论你做什么,你都无法从多个线程中运行单个 actor。
您应该阅读优秀的Akka documentation,特别是general concepts部分。如果你阅读并理解它,你将不会有这样的问题。
答案 1 :(得分:0)
尝试导入ExecutionContext.Implicits.global