gpt4 book ai didi

Akka Streams : What does Mat represents in Source[out, Mat]

转载 作者:行者123 更新时间:2023-12-03 19:56:21 26 4
gpt4 key购买 nike

在 Akka 流中,Mat in Source[Out, Mat] 或 Sink[In, Mat] 代表什么。什么时候会真正使用?

最佳答案

Mat type 参数表示此流的具体化值的类型。

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

实现流的核心方法称为 run() , 它是 definedRunnableGraph类(class)。运行流的所有其他方法(例如 runWithSink 上的 Source )最终委托(delegate)给此方法。可以看到这个方法返回Mat .也就是说,物化流会产生物化值。

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

您通过组合汇、源和流(以及其他类型的图)构建的图的每个部分都可能具有相关的物化值。例如, Source.queue 的具体化值是一个队列,一旦元素实现,您就可以使用它将元素推送到流中,具体化值为 Sink.actorSubscriberActorRef您可以使用它来与actor交互(当流被物化时由物化器创建)。另一方面,有 Flow.map这是一个没有有意义的物化值的流(当您只将纯函数应用于流时,您无法从外部控制任何东西),因此它的物化值为 NotUsed ,本质上是 Unit .

自然,流的不同部分可能包含它们自己的物化值。例如,没有什么能阻止您组合 Source.queueSink.fold .但是RunnableGraph.run()只能返回一个物化值。为了克服这个问题,Sink 上通常有两种组合方法。年代,Flow s 和其他图表,通常称为 methodmethodMat ,例如 to toMat .第二个变体允许您选择如何组合要加入的流的具体化值。例如,您可以将它们放入一个元组中以同时获取它们:

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

默认组合方法(没有 Mat 后缀)通常选择左侧或右侧具体化值,具体取决于对这种特定类型的流最自然的做法。 Keep 对象包含返回左、右或两个参数的便捷方法,特别是为了将它们用作 *Mat 的最后一个参数。方法,但没有什么能阻止您编写自己的组合函数。

关于Akka Streams : What does Mat represents in Source[out, Mat],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39727729/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com