Scala 如何停止可运行图

Scala 如何停止可运行图,scala,akka,akka-stream,Scala,Akka,Akka Stream,用akka streams开始我的第一步。我有一个类似于此的图表,它是从以下位置复制的: 我可以使用g.run() 但是我怎样才能阻止它呢? 在什么情况下我应该这样做(除了不使用-业务方面)? 此图包含在参与者中。如果参与者崩溃,那么底层参与者的图形会发生什么情况?它也会终止吗?有一个KillSwitch功能应该适合您。检查另一个SO问题的答案:有一个KillSwitch功能应该适合您。检查另一个SO问题的答案:如中所述,从图形外部完成图形的方法是使用KillSwitch。您从文档中复制的示例并

用akka streams开始我的第一步。我有一个类似于此的图表,它是从以下位置复制的:

我可以使用
g.run()
但是我怎样才能阻止它呢? 在什么情况下我应该这样做(除了不使用-业务方面)?
此图包含在参与者中。如果参与者崩溃,那么底层参与者的图形会发生什么情况?它也会终止吗?

有一个KillSwitch功能应该适合您。检查另一个SO问题的答案:

有一个KillSwitch功能应该适合您。检查另一个SO问题的答案:

如中所述,从图形外部完成图形的方法是使用
KillSwitch
。您从文档中复制的示例并不是说明这种方法的好例子,因为源代码只是一个元素,当您运行它时,流将很快完成。让我们调整图表,以便更容易地看到动作中的
KillSwitch

val topSink = Sink.foreach(println)
val bottomSink = Sink.foreach(println)
val sharedDoubler = Flow[Int].map(_ * 2)
val killSwitch = KillSwitches.single[Int]

val g = RunnableGraph.fromGraph(GraphDSL.create(topSink, bottomSink, killSwitch)((_, _, _)) {
  implicit builder => (topS, bottomS, switch) =>

  import GraphDSL.Implicits._

  val broadcast = builder.add(Broadcast[Int](2))
  Source.fromIterator(() => (1 to 1000000).iterator) ~> switch ~> broadcast.in

  broadcast.out(0) ~> sharedDoubler ~> topS.in
  broadcast.out(1) ~> sharedDoubler ~> bottomS.in
  ClosedShape
})

val res = g.run // res is of type (Future[Done], Future[Done], UniqueKillSwitch)
Thread.sleep(1000)
res._3.shutdown()
源现在由一百万个元素组成,汇现在打印广播的元素。在我们调用
shutdown
来完成流之前,流运行一秒钟,这不足以搅动所有一百万个元素

如果在参与者内运行流,则为运行流而创建的底层参与者(或多个参与者)的生命周期是否与“封闭”参与者的生命周期相关联取决于物化器的创建方式。有关更多信息,请阅读。科林·布雷克(Colin Breck)关于使用参与者和
KillSwitch
管理流的生命周期的以下博文也很有帮助:

如中所述,从图形外部完成图形的方法是使用
KillSwitch
。您从文档中复制的示例并不是说明这种方法的好例子,因为源代码只是一个元素,当您运行它时,流将很快完成。让我们调整图表,以便更容易地看到动作中的
KillSwitch

val topSink = Sink.foreach(println)
val bottomSink = Sink.foreach(println)
val sharedDoubler = Flow[Int].map(_ * 2)
val killSwitch = KillSwitches.single[Int]

val g = RunnableGraph.fromGraph(GraphDSL.create(topSink, bottomSink, killSwitch)((_, _, _)) {
  implicit builder => (topS, bottomS, switch) =>

  import GraphDSL.Implicits._

  val broadcast = builder.add(Broadcast[Int](2))
  Source.fromIterator(() => (1 to 1000000).iterator) ~> switch ~> broadcast.in

  broadcast.out(0) ~> sharedDoubler ~> topS.in
  broadcast.out(1) ~> sharedDoubler ~> bottomS.in
  ClosedShape
})

val res = g.run // res is of type (Future[Done], Future[Done], UniqueKillSwitch)
Thread.sleep(1000)
res._3.shutdown()
源现在由一百万个元素组成,汇现在打印广播的元素。在我们调用
shutdown
来完成流之前,流运行一秒钟,这不足以搅动所有一百万个元素

如果在参与者内运行流,则为运行流而创建的底层参与者(或多个参与者)的生命周期是否与“封闭”参与者的生命周期相关联取决于物化器的创建方式。有关更多信息,请阅读。科林·布雷克(Colin Breck)关于使用参与者和
KillSwitch
管理流的生命周期的以下博文也很有帮助: