Подтвердить что ты не робот

Akka поток toMat

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

Спасибо Арун

4b9b3361

Ответ 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)

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