Akka 阿克卡溪流:Mat在源[输出,Mat]中代表什么

Akka 阿克卡溪流:Mat在源[输出,Mat]中代表什么,akka,akka-stream,reactive-streams,Akka,Akka Stream,Reactive Streams,在阿克卡溪流中,Mat In Source[输出,Mat]或Sink[输入,Mat]代表什么。何时实际使用它?类型参数表示此流的物化值的类型 请记住,在Akka源代码中,流代码中,汇代码中(好吧,所有图形)都只是蓝图-它们自己不做任何处理,它们只描述流应该如何构造。将这些蓝图转化为具有实时数据的工作流的过程称为物化 具体化流的核心方法称为run(),它位于RunnableGraph类中。运行流的所有其他方法(例如接收器上的运行方式或源)最终委托给此方法。您可以看到此方法返回Mat。也就是说,物化

在阿克卡溪流中,Mat In Source[输出,Mat]或Sink[输入,Mat]代表什么。何时实际使用它?

类型参数表示此流的物化值的类型

请记住,在Akka
源代码中,
流代码中,
汇代码中(好吧,所有图形)都只是蓝图-它们自己不做任何处理,它们只描述流应该如何构造。将这些蓝图转化为具有实时数据的工作流的过程称为物化

具体化流的核心方法称为
run()
,它位于
RunnableGraph
类中。运行流的所有其他方法(例如
接收器上的
运行方式
)最终委托给此方法。您可以看到此方法返回
Mat
。也就是说,物化流会产生物化值

例如,有一个接收器,它将一个流中的所有值组合成一个值,并使用构造该值。但是你如何得到这个值呢?由于流是异步运行的,因此该值的自然类型为
Future[T]
,其中
T
是折叠累加器的类型。原来,
Sink.fold
返回
Sink[In,Future[T]]
,也就是说,这个
Future[T]
是它的物化值,因此,当你物化它时,你会得到一个
Future[T]的实例
然后您可以在自己的代码中使用它进行进一步处理:如果流正确完成,它将以值完成;如果流因异常终止,它将以失败完成

通过组合汇、源和流(以及其他类型的图)构建的图的每个部分都可能具有关联的物化值。例如,的物化值是一个队列,您可以使用它在物化后将元素推送到流中,而
Sink的物化值。actorSubscriber
是一个
ActorRef
,您可以使用它与参与者交互(流物化时由物化器创建)。另一方面,还有
Flow.map
,它是一个没有任何有意义的物化值的流(当您只对流应用纯函数时,没有任何外部控制),因此它的物化值是
未使用的
,本质上是
单位

当然,流的不同部分可能包含它们自己的物化值。例如,没有任何东西阻止您组合
源.queue
接收器.fold
。但是
RunnableGraph.run()
只能返回一个物化值。为了克服这一点,通常有两种不同的组合方法,分别是
Sink
s、
Flow
s和其他图形,通常称为
method
methodMat
,例如和。第二个变量允许您选择如何组合要加入的流的物化值。例如,您可以将它们放入一个元组中,以获得它们:

val (queue, future) = Source.queue[Int](10, OverflowStrategy.fail)
  .map(x => x + 10)
  .toMat(Sink.fold(0)(_ + _))(Keep.both)
  .run()

默认组合方法(不带
Mat
后缀)通常选择左边或右边的物化值,这取决于对这种特定类型的流最自然的操作。该对象包含方便的方法,这些方法返回左、右或两个参数,特别是为了将它们用作
*Mat
方法的最后一个参数,但没有任何东西阻止您编写自己的组合函数

它代表了图物化的概念。你可能想读一下这本书。多好的解释啊!谢谢弗拉基米尔!我们需要更多像你这样的人!