如何在akka和scala中实现多线程?

cit*_*ity 2 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 _=> .....
 }
Run Code Online (Sandbox Code Playgroud)

我的问题是:

1)我不确定我的代码是否会像我期望的那样工作.参考使用演员内部的Akka调度程序

2)我已经导入了

import scala.math._
import akka.actor._
import scala.util.Random
import scala.concurrent.duration._
Run Code Online (Sandbox Code Playgroud)

但编译器仍然报告错误:

error: Cannot find an implicit ExecutionContext, either require one yourself or import ExecutionContext.Implicits.global
        context.system.scheduler.scheduleOnce(duration, self, WakeUp)
Run Code Online (Sandbox Code Playgroud)

Vla*_*eev 18

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

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

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