2013-10-04 4 views
2

Теперь я хочу, чтобы актер отправлял сообщения другим актерам и в то же время получал сообщения от других. Кажется, мне нужно использовать несколько потоков в Акке. Ниже мой код:Как реализовать несколько потоков в akka & scala?

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

Запрашиваю * Я хочу, чтобы актер отправлял сообщения другим актерам и в то же время получал сообщения от других * - это то же самое, что и * Как я могу стрелять в ногу *. Вы обмениваете каждую точку актерской модели на огромную кучу проблем. Scala не создан только для актеров (например, Erlang), поэтому, если вам действительно нужно использовать простой-старый-Java-параллелизм с голой нитью и свистами, используйте его. –

ответ

18

Вы делаете всю вещь не прав. Актеры разработаны специально для устранения большинства проблем, вызванных ручным управлением потоками. Одной из особенностей этого является то, что актеры всегда работают последовательно. You не может заставить актера обрабатывать более одного сообщения за раз. Akka даже предоставляет несколько гарантий относительно сообщений и их порядка. Это позволяет обеспечить полную безопасность потоков, если вы не делаете ничего глупого, например, используя измененные сообщения или вызываете другие объекты актера напрямую.

Конечно, вы можете запускать разные актеры в отдельных потоках (используя правильный диспетчер), и они действительно будут обрабатывать свои сообщения параллельно. Но вы не можете запустить одиночный актер от несколько темы, что бы вы ни делали.

Вы действительно должны отлично читать Akka documentation, особенно его раздел на general concepts. У вас не будет таких вопросов, если вы прочитаете и поймете это.

0

Попробуйте импортировать ExecutionContext.Implicits.global

+0

не работает. Но я добавляю «import context.dispatcher», он работает. Теперь моя проблема заключается в том, что этот метод не может работать так, как я ожидаю. Есть ли у вас какие-либо идеи? благодаря – city

0

Использование маршрутизатора: , например.

вал router1 = system.actorOf (Реквизит [SomeMultiThreadActorClass] .withRouter (RoundRobinRouter (nrOfInstances = 5)))

Рассмотрим отдельные домены приложений (если ваша платформа позволяет ему), чтобы избежать одну нить отрицательно влияя на другой.

Смежные вопросы