Асинхронный расчет Scala с использованием akka

я пытаюсь разработать программу, которая будет получать набор входных данных (скажем, некоторые числа)

он будет делать некоторые вычисления для каждого из входных данных и собирать результат

Мне нужно, чтобы это был асинхронный расчет.

Заглянул в scala и akka, и он выглядит идеально, но я не могу понять дизайн моих актеров, и кто будет это делать?

например: создать 1 актера для каждого расчета? и 1 актер для сбора всех результатов?

любая идея или документация для проектов с использованием akka?

Спасибо!


person The Best    schedule 09.04.2014    source источник
comment
Вам нужны все входные данные, чтобы начать расчет? или есть один расчет на вход? Что вы делаете с результатом?   -  person toto2    schedule 09.04.2014
comment
на данный момент я получаю набор входных данных, и мне нужно сделать некоторые вычисления в зависимости от типа ввода, после того, как все вычисления завершены, мне нужно получить набор результатов и мне еще несколько вычислений по нему.   -  person The Best    schedule 10.04.2014


Ответы (2)


Посмотрите на этот пример проекта

это пример системы актеров akka, в которой есть 1 актер, который получает входной набор

для каждого входа будет создан дочерний актор, который вычислит это и в конце покажет результаты всех дочерних акторов

файл ознакомительных сведений: https://github.com/Nimrod007/Akka-Compute

код: https://github.com/Nimrod007/Akka-Compute/blob/master/akkaComputeExample/src/main/scala/AkkaComputeApp.scala

person Nimrod007    schedule 09.04.2014
comment
просто зайдите в корневую папку проекта - person Nimrod007; 09.04.2014

Я не отвечаю на ваш вопрос напрямую, так как Nimrod007 уже сделал это. Я не уверен, какое у вас реальное приложение, но я просто хотел показать вам, что использование простых фьючерсов может быть намного проще.

import scala.concurrent._
import scala.concurrent.duration._
import ExecutionContext.Implicits.global

object Example extends App {
  val futures = Range(1, 5).map(i => Future { i + 10 })
  val result = Future.fold(futures)(List.empty[Int])((answers, value) => value :: answers)
  result.onComplete(answersTry => answersTry.foreach(println))
  Thread.sleep(1000)
}

Он делает то же самое, что и код Nimrod007, но намного короче.

Я не имею в виду, что вы не должны использовать Akka. Но вы должны рассмотреть, что является наиболее подходящим для вашего приложения.

person toto2    schedule 09.04.2014
comment
это коротко и ясно, но мне нужен пример с использованием akka (позже система будет делать больше вещей и может быть распространена позже) - person The Best; 10.04.2014
comment
еще один момент, который следует принять во внимание, заключается в том, что в akka мне намного легче справляться с отказами. - person The Best; 10.04.2014