【问题标题】:How to use futures with Akka for asynchronous results如何在 Akka 中使用 futures 来获得异步结果
【发布时间】:2026-02-09 05:45:01
【问题描述】:

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

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

【问题讨论】:

  • save 是如何定义的?
  • 好的,让我编辑我的问题以添加它
  • 请记住,硬盘不喜欢并行访问。他们放慢了速度——很多。因此,如果它们在同一个高清上,请不要并行写入文件。同样正如其他人已经提到的那样,将来不要与演员进行交流。

标签: multithreading scala akka actor future


【解决方案1】:

为什么要在对? 的调用中加上一个Future? Ask (?) 无论如何都会返回一个Future,所以你在这里所做的是将一个Future 包裹在另一个Future 周围,我不确定这就是你想要做的。

我看到的第二个问题是您正在向同一个参与者实例发送两条消息,并且您希望它们并行运行。演员实例串行处理其邮箱。如果您想同时处理,那么您将需要两个 FileWriter 演员实例来完成此操作。如果这就是您想要做的,那么只需启动另一个 FileWriter 实例并发送第二条消息。

【讨论】:

  • 你是绝对正确的,我正在实例化同一个对象,现在我创建了两个不同的对象,它并行工作。非常感谢。
  • 还有一个问题,如果我想开始说 100 个 fileWriter 实例怎么办,最好的做法是什么?
  • 对于这种情况,我建议使用池路由器,然后使用循环或最小邮箱策略。让演员长寿并坐在路由器后面,路由器会将消息分发给他们。查看Routers 上的文档以了解如何完成这项工作,但从创建的角度来看,它看起来像这样:system.actorOf(Props[MyWriter].withRouter(RoundRobinRouter(100)), "filewriter")。文档:doc.akka.io/docs/akka/2.1.4/scala/routing.html