akka stream toMat

ASe*_*ASe 20 streaming scala akka akka-stream

我试图了解在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)
Run Code Online (Sandbox Code Playgroud)
  1. 什么是使用viaMat vs via?
  2. 什么是toMat在viaMat到toMat之间做什么?
  3. 什么是keep.both的用途,是否意味着我可以从之前和当前的一个实现价值,如果是,那么我如何能够获得这些价值.

谢谢阿伦

Gio*_*tti 25

  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)
Run Code Online (Sandbox Code Playgroud)

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