3

现在我想要一个演员向其他演员发送消息,同时接收来自其他人的消息。看来我需要在 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)我不确定我的代码会按预期工作。参考在actor内部使用Akka调度器

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)
4

3 回答 3

20

你做错了整个事情。Actors 是专门为消除手动线程管理引起的大多数问题而设计的。其特点之一是演员总是按顺序工作。您不能强制参与者一次处理多个消息。Akka 甚至提供了一些关于消息及其顺序的保证。这允许完全线程安全,如果你不做任何愚蠢的事情,比如使用可变消息或直接调用其他参与者对象。

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

你真的应该阅读优秀的Akka 文档,尤其是关于一般概念的部分。如果您阅读并理解它,您将不会有这样的问题。

于 2013-10-04T05:43:37.330 回答
0

尝试导入 ExecutionContext.Implicits.global

于 2013-10-04T01:51:23.663 回答
0

使用路由器:例如

val router1 = system.actorOf(Props[SomeMultiThreadActorClass].withRouter(RoundRobinRouter(nrOfInstances = 5)))

考虑单独的应用程序域(如果您的平台允许)以避免一个线程对另一个线程产生不利影响。

于 2015-08-25T11:06:30.320 回答