【问题标题】:Is it possible to spawn actors into stream?是否可以将演员生成到流中?
【发布时间】:2021-04-18 09:53:20
【问题描述】:

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

  • 警告:此方法不是线程安全的,不能从普通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
  }

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

【问题讨论】:

  • 我不确定“为什么”,但您绝对可以在各自的流组件中创建任意数量的演员。只需使用图形组件 api 创建您的自定义流组件,然后在其中做任何您想做的事情。另外,您为什么要专门使用spawn 来创建您的演员?为什么不按正常方式创建它们?
  • 我是 akka 类型的新手,所以我如何创建演员而不是 spawn
  • 据我所见,classic-actors 在 Akka 流中的表现更好。那么,在那个地方你真的需要一个打字演员吗?

标签: scala akka akka-typed


【解决方案1】:

由于流将具体化为不同的actor,因此几乎可以肯定你不能关闭流中的ActorContext(如果它恰好在与封闭actor上次运行的线程相同的线程中执行,它会赢'不要炸毁),例如产卵。

作为替代方案:

  • 如果您不特别关心生成的演员是该演员的孩子(例如,在经典中,您将使用 system.actorOf),您可以拥有监护演员(具有生成 @ 行为的演员) 987654323@) 生成演员:您可以滚动自己的协议来进行此类生成,或者让监护人实现SpawnProtocol。然后,您可以将适当的消息发送到 context.system,但请注意,您需要使用 context.system.unsafeUpcast 来使用您正在使用的协议。由于您应该控制监护人的协议,因此不太可能失败,但编译器不会真正帮助您。

  • 如果您确实希望生成的actors 是子actor,并且您还希望spawns 是异步的,那么实现此目的的最佳方式可能是通过导致只生成actor 的内部消息。然后在流中,您只需将这些消息发送给自己。

  • 如果您不希望生成是异步的(应该注意,在流中生成它们的方法是),那么只需在消息处理线程中调用 spawn 而不是在流中。

【讨论】:

    猜你喜欢
    • 2020-07-30
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2013-09-04
    • 1970-01-01
    • 2015-02-20
    相关资源
    最近更新 更多