gpt4 book ai didi

scala - 使用不同选项的 akka 流物化值

转载 作者:行者123 更新时间:2023-12-02 02:27:42 24 4
gpt4 key购买 nike

我是 akka 流的新手,想了解流中的物化是如何工作的

//Print sum of elements from 1 to 10
val newSource = Source(1 to 10)
val flow = Flow[Int].fold(0)((a, b) => a + b)
val sink = Sink.foreach(println)
val sumFuture = newSource.via(flow).toMat(sink)(Keep.left).run()

它使用 Keep.leftKeep.right 打印值 55。两者有何不同?

我想探索一下 Keep.leftKeep.right 给出不同的值,以及我们如何使用 Keep.both

最佳答案

物化值(value)可以由汇点和源点产生。通过将源组合到接收器来创建可运行的图。 Keep 定义组合时保留哪个物化值

  • Keep.right 选择接收器的物化值
  • Keep.left 选择源的具体化值
  • Keep.both 以元组的形式选择两者
  • Keep.none 忽略两者并选择 NotUsed,即指示没有具体化值的标记。

默认情况下,Keep.left 用于viato 等操作

以下示例突出显示了这一点

给定一个 Source[Int, String] 和一个 Sink[Int, Future[Int]]

val source: Source[Int, String] = Source(List(1, 2, 3)).mapMaterializedValue(_ => "Source Mat Value")
val sink: Sink[Int, Future[Int]] = Sink.fold(0)(_ + _)

我们可以结合sourcesink来创建具有不同物化值的可运行图。

val left: String = source.to(sink).run() //same as toMat(...)(Keep.left)
val right: Future[Int] = source.toMat(sink)(Keep.right).run()
val both: (String, Future[Int]) = source.toMat(sink)(Keep.both).run()

现在,如果我们运行它并打印它产生的每个物化值,如下

left=Source Mat Value
right=Future(Success(6))
both=(Source Mat Value,Future(Success(6)))

请不要将物化值与流元素的处理混淆。

考虑以下折叠阶段

val flowFold: Flow[Int, Int, NotUsed] = Flow[Int].fold(0)(_ + _)
val sinkFold: Sink[Int, Future[Int]] = Sink.fold(0)(_ + _)

flowFoldfold 函数应用于流中的每个元素,并推送代表 fold 结果的一个值> 到下游。如果需要,可以进一步处理该元素。

然而,sinkFold 是图中的最后阶段,它无法将元素进一步推向下游。当图处理完所有元素并完成时,它使用物化值 Future[Int] 返回 fold 结果。

if the value of Flow.fold is 55 should this be the materialised value of the flow instead of NotUsed.

不,值 55 不是具体化值。它被作为一个元素推送到下游接收器。

您可以借助 Sink.head 来“捕获”物化值中的元素 55

val flow: Flow[Int, Int, NotUsed] = Flow[Int].fold(0)(_ + _)
val alternativeFoldSink: Sink[Int, Future[Int]] = flow.toMat(Sink.head)(Keep.right)

Every stage can produce materialised value then (why) can't Flow.foldgenerate materialised value.

是的,每个阶段都可能产生物化值。但 Flow.fold 的设计目的并非如此。大多数Flow定义不提供具体化值。如果您想使用物化值和 fold,我建议使用 Sink.fold

关于scala - 使用不同选项的 akka 流物化值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65404866/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com