multithreading - 处理Akka actor的receive方法中的异步调用的最佳方法

标签 multithreading scala asynchronous parallel-processing akka

我正在尝试将数据持久保存到数据库中。我的persist方法是异步的。

class MyActor(persistenceFactory:PersistenceFactory) extends Actor {
  def receive: Receive = {
    case record: Record =>
      // this method is asynchronous, immediate return Future[Int]
      persistenceFactory.persist(record) 
  }
}

当应用程序在增加的负载下运行时,瓶颈就在这里,要么是我们内存不足,要么是没有可用的线程。

那么,在Akka actor的receive方法内部处理异步调用的最佳方法是什么?

最佳答案

这是一个很好的示例,说明何时应该让一个 Actor 创建另一个 Actor 来处理交互。从本质上讲,流程是这样的,并且如果可以使您更轻松,也可以使用FSM(有限状态机)。

  • 父 Actor 收到消息
  • 父 Actor 创建子事务 Actor
  • 父级向 child 发送原始消息
  • 子级调用异步方法并存储Future
  • Child使用begin()更改其行为,以等待将来完成。有很多方法可以做到这一点,包括FSM。
  • schedules periodic messages to itself检查将来的
  • child 的新行为会检查Future是否在每次接收
  • 时完成
  • 当Future完成时, child 可以将结果与父或原始发件人进行答复(如果 parent 与原始发件人一起发送了该消息)。
  • 关于multithreading - 处理Akka actor的receive方法中的异步调用的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38945950/

    相关文章:

    java - BufferedReader 将什么字符解释为流的结尾?

    scala - 如何在 Scala 中比较两个整数数组?

    ios - 在显示数据之前处理异步下载延迟

    c# - 异步 Web 请求超时 => 使 IIS 崩溃

    iphone - 崩溃 [responseData setLength :0];

    c++ - 使用互斥锁和手动锁定互斥锁的区别

    c++ - 如何定期唤醒 C++ 11 线程?

    java - 如何从Semaphore中获取获取到的索引

    Scala:k 折交叉验证

    scala - 用 Map#getOrElse 输入奇怪的东西