CruncherBigData
CruncherBigData

Reputation: 1122

How to use futures with Akka for asynchronous results

I am trying to write to multiple files concurrently using the Akka framework, First I created a class called MyWriter that writes to a file, then using futures I call the object twice hopping that 2 files will be created for me, but when I monitor the execusion of the program, it first populates the first file and then the second one (blocking /synchronously).

Q: how can I make the code bellow run (none-blocking /asynchronously)

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") }

}

the MyWriter code:

case class save(startval: String)

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

any ideas why the code does not execute concurrently?

Upvotes: 2

Views: 1036

Answers (1)

cmbaxter
cmbaxter

Reputation: 35463

Why are you wrapping the call to ? with an additional Future? Ask (?) returns a Future anyway, so what you are doing here is wrapping a Future around another Future and I'm not surte that's what you wanted to do.

The second issue I see is that you are sending two messages to the same actor instance and you are expecting them to be running in parallel. An actor instance processes its mailbox serially. If you wanted to process concurrently, then you will need two instances of your FileWriter actor to accomplish that. If that's all you want to do then just start up another instance of FileWriter and send it the second message.

Upvotes: 4

Related Questions