是否可以将演员衍生到流中?

hgqdbh6s  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(149)

因此,我使用Akka Typed,并希望将每条消息的actor生成到某个流中,根据文档,这似乎是不可能的:

    • 警告 *:此方法不是线程安全的,不能从普通参与者消息处理线程(如scala.concurrent.Future回调)以外的线程访问。

def spawn[U](behavior: Behavior[U], name: String, props: Props = Props.empty): ActorRef[U]
示例:

Behaviors.receiveMessage {
    case StartConsume =>
      context.log.info("Starting consume messages")
      val source: Source[Int, NotUsed] = Source(1 to 10)
      source.runForeach(x => context.spawn(Test(x), "Test"))
      Behaviors.same
  }

有没有其他方法可以做到这一点?

5n0oy7gb

5n0oy7gb1#

由于流将具体化为一个不同的参与者,因此几乎可以肯定的是,您不能关闭流中的ActorContext(如果它碰巧在与封闭参与者上次运行的线程相同的线程中执行,它不会爆炸),例如,为了生成一个子对象。
作为备选方案:

  • 如果你不特别在意衍生的演员是这个演员的孩子(例如,在经典中,你会使用system.actorOf),你可以让守护演员(具有衍生ActorSystem的行为的演员)衍生演员:您可以滚动您自己的协议来进行这样的繁殖,或者让守护者实现SpawnProtocol。然后您可以向context.system发送适当的消息,但请注意,您需要使用context.system.unsafeUpcast来使用您正在使用的协议。由于您应该控制守护者的协议,因此这不太可能失败,但编译器实际上不会帮助您。
  • 如果您确实希望派生的参与者是子级,并且还希望派生是异步的,则实现此目的的最佳方式可能是通过一个内部消息,该消息导致只派生参与者。然后在流中,您只需将这些消息发送给自己。
  • 如果您不希望派生是异步的(需要注意的是,在流中派生它们的方法是异步的),那么只需在消息处理线程中调用spawn,而不必在流中。

相关问题