akka 流 toMat
Posted
技术标签:
【中文标题】akka 流 toMat【英文标题】:akka stream toMat 【发布时间】:2016-06-19 12:07:14 【问题描述】:我试图了解 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)
-
viaMat 与 via 的用途是什么?
toMat 在 viaMat 到 toMat 之间做了什么?
keep.both 的用途是什么,这是否意味着我可以从以前的值和当前值中实现值,如果是,那么我如何才能取回这些值。
谢谢 阿伦
【问题讨论】:
它应该返回如下(保持两个 Mat) val runnable:RunnableGraph[(Promise[Option[Int]], Future[Int])] = Source (1 to 10).viaMat(flow) (Keep.right).toMat(sink1)(Keep.both).run() 【参考方案1】:via 只是 viaMat(...)(Keep.left) 的一个快捷方式,实际上它是这样实现的:override def via[T, Mat2](flow: Graph[FlowShape[Out, T], Mat2]): Repr[T] = viaMat(flow)(Keep.left)
toMat 与 viaMat 相同,但对于接收器,它允许您从左侧(源/流)或右侧(接收器)或两者保留物化值
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,您可以选择将正确的物化值或两者都保留为元组。
【讨论】:
谢谢。我无法理解物化值,我知道 source 恰好是一个输出,而 Sink 恰好是一个输入,这里的 Mat 是什么?下面的代码假设返回我正确的元组......你能帮我如何打印这些: val source1 = Source (1 to 10) val sink:Sink[Int, Future[Int]]=Sink.fold[Int, Int](0)(_ + _) val runnableGraph = source1.toMat(sink)(Keep.both) val x=runnableGraph.run() 物化值是您在执行 runnableGraph.run() 时获得的值。例如,如果你使用 Sink.fold,它是一个包含折叠结果的未来。阅读:doc.akka.io/docs/akka/2.4.2/general/stream/stream-design.html 非常感谢。我从doc.akka.io/docs/akka-stream-and-http-experimental/2.0.3/scala/… 中读取了具体化值,如果我理解正确的话 - Source[+Out, +Mat], Flow[-In, +Out, +Mat] 和 Sink[-In, +Mat] 上的 Mat 类型参数是运行时间。 类型参数称为编译时间。当您运行(又名物化)流时,值本身是在运行时创建的。你会接受答案吗? :P【参考方案2】:我可以从 akka-user 组获得一些细节
https://groups.google.com/forum/#!topic/akka-user/Ofnx_XzWrTU
【讨论】:
以上是关于akka 流 toMat的主要内容,如果未能解决你的问题,请参考以下文章
Akka 流 2.6。如何创建 ActorMaterializer?
访问由 Source.actorRef 创建的 akka 流 Source 的底层 ActorRef
在线程“ main”中获取Akka流代码时出错,异常java.lang.NoClassDefFoundError:scala / Function1 $ class