- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Akka 流中,Mat in Source[Out, Mat] 或 Sink[In, Mat] 代表什么。什么时候会真正使用?
最佳答案
Mat
type 参数表示此流的具体化值的类型。
请记住,在 Akka Source
, Flow
, Sink
(好吧,所有图表)只是蓝图——它们自己不做任何处理,它们只描述应该如何构造流。将这些蓝图转化为具有实时数据的工作流的过程称为物化。
实现流的核心方法称为 run()
, 它是 defined在 RunnableGraph
类(class)。运行流的所有其他方法(例如 runWith
或 Sink
上的 Source
)最终委托(delegate)给此方法。可以看到这个方法返回Mat
.也就是说,物化流会产生物化值。
例如,有一个接收器将流中的所有值组合成一个值,它是用 Sink.fold
构造的。 .但是你如何得到这个值呢?由于流是异步运行的,因此该值的自然类型为 Future[T]
, 其中 T
是折叠累加器的类型。原来,Sink.fold
返回 Sink[In, Future[T]]
,也就是这个Future[T]
是它的物化值,因此,当你物化它时,你会得到一个 Future[T]
的实例然后您可以在自己的代码中使用它进行进一步处理:如果流正确完成,它将以一个值完成,如果流因异常终止,它将以失败完成。
您通过组合汇、源和流(以及其他类型的图)构建的图的每个部分都可能具有相关的物化值。例如, Source.queue
的具体化值是一个队列,一旦元素实现,您就可以使用它将元素推送到流中,具体化值为 Sink.actorSubscriber
是 ActorRef
您可以使用它来与actor交互(当流被物化时由物化器创建)。另一方面,有 Flow.map
这是一个没有有意义的物化值的流(当您只将纯函数应用于流时,您无法从外部控制任何东西),因此它的物化值为 NotUsed
,本质上是 Unit
.
自然,流的不同部分可能包含它们自己的物化值。例如,没有什么能阻止您组合 Source.queue
和 Sink.fold
.但是RunnableGraph.run()
只能返回一个物化值。为了克服这个问题,Sink
上通常有两种组合方法。年代,Flow
s 和其他图表,通常称为 method
和 methodMat
,例如 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/
我是一名优秀的程序员,十分优秀!