Scala 有可能在流中产生演员吗?
因此,我使用Akka类型,并希望将每条消息的actor生成到一些流中,根据文档,这似乎是不可能的: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 =>
- 警告:此方法不是线程安全的,不能从普通参与者消息处理线程以外的线程访问,例如[[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
spawn
来创建参与者?为什么不以正常的方式创建它们呢?我是akka类型的新手,那么我如何创建演员而不是spawn
。那么,在那个地方你真的需要一个打字演员吗?