Akka 阿克卡溪流:Mat在源[输出,Mat]中代表什么
在阿克卡溪流中,Mat In Source[输出,Mat]或Sink[输入,Mat]代表什么。何时实际使用它?类型参数表示此流的物化值的类型 请记住,在AkkaAkka 阿克卡溪流:Mat在源[输出,Mat]中代表什么,akka,akka-stream,reactive-streams,Akka,Akka Stream,Reactive Streams,在阿克卡溪流中,Mat In Source[输出,Mat]或Sink[输入,Mat]代表什么。何时实际使用它?类型参数表示此流的物化值的类型 请记住,在Akka源代码中,流代码中,汇代码中(好吧,所有图形)都只是蓝图-它们自己不做任何处理,它们只描述流应该如何构造。将这些蓝图转化为具有实时数据的工作流的过程称为物化 具体化流的核心方法称为run(),它位于RunnableGraph类中。运行流的所有其他方法(例如接收器上的运行方式或源)最终委托给此方法。您可以看到此方法返回Mat。也就是说,物化
源代码中,流代码中,汇代码中(好吧,所有图形)都只是蓝图-它们自己不做任何处理,它们只描述流应该如何构造。将这些蓝图转化为具有实时数据的工作流的过程称为物化
具体化流的核心方法称为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
方法的最后一个参数,但没有任何东西阻止您编写自己的组合函数 它代表了图物化的概念。你可能想读一下这本书。多好的解释啊!谢谢弗拉基米尔!我们需要更多像你这样的人!