如何在akka&中实现多线程Scala呢?

时间:2013-10-04 00:28:39

标签: multithreading scala akka

现在我想要一个演员向其他演员发送消息,同时接收来自其他人的消息。看来我需要在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)

2 个答案:

答案 0 :(得分:18)

你做错了。 Actors专门用于消除手动线程管理引起的大多数问题。其中一个功能是演员始终按顺序工作。您无法强制玩家一次处理多条消息。 Akka甚至提供了关于消息及其顺序的若干保证。如果你不做任何愚蠢的事情,比如使用可变消息或直接调用其他actor对象,这允许完全线程安全。

当然,你可以在不同的线程中运行不同的actor(使用正确的调度程序),他们真的会并行处理他们的消息。但无论你做什么,你都无法从多个线程中运行单个 actor。

您应该阅读优秀的Akka documentation,特别是general concepts部分。如果你阅读并理解它,你将不会有这样的问题。

答案 1 :(得分:0)

尝试导入ExecutionContext.Implicits.global