如何使用Akka的期货来获得异步结果

时间:2013-05-19 13:40:06

标签: multithreading scala akka actor future

我正在尝试使用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)
  }

为什么代码不会同时执行的任何想法?

1 个答案:

答案 0 :(得分:4)

为什么要使用?来追加Future的来电?问(?)无论如何都会返回一个Future,所以你在这里做的是将Future包裹在另一个Future附近,我不是那么你想要做的事情。

我看到的第二个问题是你正在向同一个actor实例发送两条消息,并且你期望它们并行运行。 actor实例以串行方式处理其邮箱。如果你想同时处理,那么你需要两个FileWriter actor的实例才能完成。如果这就是您要做的全部,那么只需启动另一个FileWriter实例并向其发送第二条消息。