Как да използвате фючърси с Akka за асинхронни резултати

Опитвам се да пиша в множество файлове едновременно, като използвам рамката Akka. Първо създадох клас, наречен MyWriter, който пише във файл, след това използвайки фючърси, извиквам обекта два пъти, като подскачам, че ще бъдат създадени 2 файла за мен, но когато наблюдавам изпълнение на програмата, тя първо попълва първия файл и след това втория (блокиране /синхронно).

Въпрос: как мога да накарам кода по-долу да се изпълнява (без блокиране /асинхронно)

import akka.actor._
import akka.dispatch._
import akka.pattern.ask
import akka.util.Timeout

import scala.concurrent.Await
import scala.concurrent.duration._
import scala.concurrent.Future
import scala.concurrent.{ ExecutionContext, Promise }
import ExecutionContext.Implicits.global

class my_controler {

}

object Main extends App {

  val system = ActorSystem("HelloSystem")
  val myobj = system.actorOf(Props(new MyWriter), name = "myobj")
  implicit val timeout = Timeout(50 seconds)
  val future2 = Future { myobj ! save("lots of conentet") }
  val future1 = Future { myobj ! save("event more lots of conentet") }

}

кодът на MyWriter:

case class save(startval: String)

class MyWriter extends Actor {
  def receive = {
    case save(startval) => save_to_file(startval)
  }

някакви идеи защо кодът не се изпълнява едновременно?


person CruncherBigData    schedule 19.05.2013    source източник
comment
Как беше дефинирано save?   -  person om-nom-nom    schedule 19.05.2013
comment
добре, нека редактирам въпроса си, за да го добавя   -  person CruncherBigData    schedule 19.05.2013
comment
Не забравяйте, че твърдите дискове не обичат паралелния достъп. Забавят се - много. Така че не пишете файлове паралелно, ако са на един и същ hd. Освен това, както вече споменахме, не отлагайте комуникацията с актьор в бъдеще.   -  person SpiderPig    schedule 19.05.2013


Отговори (1)


Защо обвивате обаждането до ? с допълнителен Future? Ask (?) така или иначе връща Future, така че това, което правите тук, е да увиете Future около друго Future и не съм сигурен, че това е, което искахте да направите.

Вторият проблем, който виждам, е, че изпращате две съобщения до един и същ екземпляр на актьор и очаквате те да се изпълняват паралелно. Екземпляр на актьор обработва своята пощенска кутия серийно. Ако искате да обработвате едновременно, тогава ще ви трябват два екземпляра на вашия FileWriter актьор, за да постигнете това. Ако това е всичко, което искате да направите, тогава просто стартирайте друго копие на FileWriter и му изпратете второто съобщение.

person cmbaxter    schedule 19.05.2013
comment
вие сте абсолютно прав, създавах един и същ обект, сега, когато създадох два различни обекта, той работеше паралелно. Много благодаря. - person CruncherBigData; 19.05.2013
comment
Още един въпрос, какво ще стане, ако искам да започна да речем 100 екземпляра на fileWriter, каква е най-добрата практика да направя това? - person CruncherBigData; 19.05.2013
comment
За този сценарий бих предложил да използвате обединен рутер и след това нещо като кръгова стратегия или стратегия за най-малката пощенска кутия. Да са живи актьорите и да седнат зад рутера, който ще им раздава съобщенията. Вижте документите на Routers за това как да накарате това да работи, но от точката на създаване ще изглежда така: system.actorOf(Props[MyWriter].withRouter(RoundRobinRouter(100)), "filewriter"). Документи: doc.akka.io/docs/akka/2.1. 4/scala/routing.html - person cmbaxter; 19.05.2013