акка поток на мат

Пытаюсь понять, что делает 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 делает между viaMat и toMat?
  3. каково использование keep.both, означает ли это, что я могу материализовать значение из предыдущего и текущего, если да, то как я могу вернуть эти значения.

Спасибо Арун


person ASe    schedule 05.03.2016    source источник
comment
Он должен вернуть следующее (сохраняя оба Mat) val runnable: RunnableGraph [(Promise [Option [Int]], Future [Int])] = Source (от 1 до 10) .viaMat (flow) (Keep.right) .toMat ( ink1) (Keep.both) .run ()   -  person ASe    schedule 05.03.2016


Ответы (2)


  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)

Когда вы соединяете две части потока (например, источник и поток / сток или поток и сток), каждая из них имеет материализованное значение, которое вы получаете при запуске потока. Поведение по умолчанию при сочетании с переходными отверстиями / переходами - сохранение левой стороны. Если вы используете viaMat / toMat, вы можете сохранить правильное материализованное значение или оба значения в виде кортежа.

person Giovanni Caporaletti    schedule 05.03.2016
comment
Спасибо. Я не могу понять материализованное значение, я знаю источник ровно один выход, а приемник ровно один вход, а что это за Мат? Предполагается, что приведенный ниже код вернет мне правильный кортеж ... не могли бы вы мне помочь, как я могу их распечатать: val source1 = Source (от 1 до 10) val раковина: Sink [Int, Future [Int]] = Sink.fold [Int, Int] (0) (_ + _) val runnableGraph = source1.toMat (приемник) (Keep.both) val x = runnableGraph.run () - person ASe; 06.03.2016
comment
материализованное значение - это то, что вы получаете, когда выполняете runnableGraph.run (). например, если вы используете Sink.fold, это будущее, содержащее результат сворачивания. Прочтите это: doc.akka.io/docs /akka/2.4.2/general/stream/stream-design.html - person Giovanni Caporaletti; 06.03.2016
comment
Большое спасибо. Я прочитал Материализованные значения из http://doc.akka.io/docs/akka-stream-and-http-experimental/2.0.3/scala/stream-quickstart.html#materialized-values Если я правильно понял - параметры типа Mat на Source [+ Out, + Mat] , Flow [-In, + Out, + Mat] и Sink [-In, + Mat] - время выполнения. - person ASe; 06.03.2016
comment
параметр типа известен во время компиляции. Само значение создается во время выполнения, когда вы запускаете (или материализуете) поток. Ты собираешься принять ответ? :П - person Giovanni Caporaletti; 06.03.2016

некоторые подробности, которые я смог получить от группы пользователей akka

https://groups.google.com/forum/#!topic/akka-user/Ofnx_XzWrTU

person ASe    schedule 07.03.2016