gpt4 book ai didi

scala - akka 流 toMat

转载 作者:行者123 更新时间:2023-12-03 01:19:00 26 4
gpt4 key购买 nike

我试图了解 toMat 在 akka 流中的作用。例如:

val sink1:Sink[Int, Future[Int]]=Sink.fold[Int,Int](0)(_ + _)

val flow=Flow[Int].fold[Int](0){(x,y)=> x+y}

val runnable = Source (1 to 10).viaMat(flow)(Keep.right).toMat(sink1)(Keep.both)
  1. viaMat 与 via 有何用途?
  2. toMat 在 vi​​aMat 到 toMat 之间做什么?
  3. keep.both 有何用处,这是否意味着我可以从前一个和当前的值中实现值(value),如果是,那么我如何取回这些值。

谢谢阿伦

最佳答案

  1. via 只是 viaMat(...)(Keep.left) 的快捷方式,实际上这就是它的实现方式:override def via[T, Mat2](flow: Graph[FlowShape [Out, T], Mat2]): Repr[T] = viaMat(flow)(Keep.left)

  2. toMat 与 viaMat 相同,但对于接收器,它允许您保留左侧(源/流)或右侧(接收器)或两侧的物化值

  3. Keep.both 只是 (a:A,b:B) => (a, b) 的别名,它是一个接受两个输入参数并返回的函数它们作为一个元组。用于在组合两个流(或源和流或流和汇等)时具有左侧和右侧的物化值

我将剖析您的代码行:

// you're keeping the materialized value of flow
val source2 = Source (1 to 10).viaMat(flow)(Keep.right)
// you're keeping both materialized values, i.e. the one of flow from previous step
// and the one o sink.
val runnableGraph = source2.toMat(sink)(Keep.both)
runnableGraph.run() // returns a tuple (flowMatVal, sinkMatVal)

当您连接流的两个部分(即源和流/汇或流和汇)时,每个部分都有一个在运行流时获得的具体化值。与 via/to 组合时的默认行为是保留左侧。如果您使用 viaMat/toMat,您可以选择保留正确的物化值或将它们两者都保留为元组。

关于scala - akka 流 toMat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35818358/

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