Scala 有可能在流中产生演员吗?

Scala 有可能在流中产生演员吗?,scala,akka,akka-typed,Scala,Akka,Akka Typed,因此,我使用Akka类型,并希望将每条消息的actor生成到一些流中,根据文档,这似乎是不可能的: 警告:此方法不是线程安全的,不能从普通参与者消息处理线程以外的线程访问,例如[[scala.concurrent.Future]]回调 def spawn[U](行为:行为[U],名称:字符串,props:props=props.empty):ActorRef[U] 例如: Behaviors.receiveMessage { case StartConsume =>

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

  • 警告:此方法不是线程安全的,不能从普通参与者消息处理线程以外的线程访问,例如[[scala.concurrent.Future]]回调
def spawn[U](行为:行为[U],名称:字符串,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
  }

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

由于流将具体化为不同的参与者,因此几乎可以肯定的是,您不能关闭流中的
ActorContext
(如果它恰好与封闭的参与者上次运行时在同一线程中执行,它不会爆炸),例如,为了生成子对象

作为替代方案:

  • 如果您不特别关心生成的参与者是否是该参与者的孩子(例如,在经典中,您将使用
    system.actorOf
    ),那么您可以拥有守护者参与者(具有生成
    ActorSystem
    的行为的参与者)繁殖参与者:你可以使用你自己的协议来进行繁殖,或者让守护者实现
    SpawnProtocol
    。然后,您可以将适当的消息发送到
    context.system
    ,但请注意,您需要将
    context.system.unsafeUpcast
    用户发送到您正在使用的协议。既然你应该控制《卫报》的协议,那就不太可能失败,但编译器不会真正帮助你

  • 如果您确实希望生成的角色是子角色,并且您也希望生成的角色是异步的,那么实现这一点的最佳方法可能是通过一条内部消息来生成角色。然后在流中,您只需将这些消息发送给自己

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


我不知道“为什么”,但您完全可以在各自的流组件中创建任意数量的参与者。只需使用graph component api创建自定义流组件,然后在其中执行您想要的任何操作。另外,为什么要专门使用
spawn
来创建参与者?为什么不以正常的方式创建它们呢?我是akka类型的新手,那么我如何创建演员而不是
spawn
。那么,在那个地方你真的需要一个打字演员吗?