物化值是什么意思,为什么它在同一图表的以下逻辑中不同?

What does a Materialized value means and why it is different in below logic for same graph?

我是 Akka Stream 的新手,上周才开始阅读它的文档。我能够理解大部分概念,但我发现很难理解 Materialized Value 在 Akka 流中的含义及其意义是什么?

如果有人能用一个真实世界的例子向我解释这一点,这将有助于将它与其在 Akka Stream 中的用例相关联。

更新

我正在看下面的例子,想了解我们为同一张图获得的两种不同类型的输出。我知道它与 Materialized Value 有直接关系,这就是我问上述问题的原因。

  implicit val system = ActorSystem("PlainSinkProducerMain")
  implicit val materializer = ActorMaterializer()
  val source = Source(1 to 10)
  val sink = Sink.fold[Int, Int](0)(_ + _)
  val runnable: RunnableGraph[Future[Int]] =
  source.toMat(sink)(Keep.right)
  val sum1: Future[Int] = runnable.run()
  val sum2: Future[Int] = runnable.run()
   println(sum1.value)
   println(sum2.value)

当我 运行 时,我得到以下输出:

None
Some(Success(55))

上面的例子来自docs,下面是对它的解释。

Since a stream can be materialized multiple times, the materialized value will also be calculated anew for each such materialization, usually leading to different values being returned each time. In the example below we create two running materialized instance of the stream that we described in the runnable variable, and both materializations give us a different Future from the map even though we used the same sink to refer to the future.

我有两个问题: 1)为什么同一个图的2个不同的物化实例有2个不同的输出值?虽然物化值被计算了两次,但在引擎盖下,两次计算都是针对同一个图表。

2) 为什么 return 类型是 Some(Success(55)) 而不是普通的 55 表示成功执行而 Failure Exception 表示失败? (这可能是个愚蠢的问题,但我想了解 problem/advantage 这个特殊的 return 值 solves/gives 是做什么的。)

(评论的答案)我不确定我是否完全理解你的问题,但一般来说流是异步的,当你执行 run() 来具体化一个流时,它开始在不同的线程中执行水池。因此,即使流立即终止,也不能保证该值将立即可用。这就是为什么 Sink.fold 的结果是 Future[T] - 期货意味着将可用的值 "in future",而这正是这里需要的语义。

"why ... have 2 different values" - 正是因为异步性。在你的情况下,碰巧第二个未来在你观察到它之前已经完成,但第一个没有。如果你多次 运行 这个程序,你很可能会得到不同的结果。

"why the return type is Some(Success(55))..." 好吧,Scala 中的 future 就是这样设计的。 Future.value方法returnsOption[Try[T]],即returnsNone如果future在调用的那一刻没有完成,Some(v)如果完成,其中 vSuccess(result)Failure(throwable)。通常,在 Scala 中,惯用的做法是将错误视为值而不是异常,异常会在抛出时隐式展开调用堆栈。

请注意,在使用期货时通常不使用 Future.value。通常,您使用 mapflatMapFuture.sequence 等组合器转换 future,然后将最终转换的 future 的结果传递给某个库(例如,作为 Web 框架中的 HTTP 响应)或使用类似 Await.result(future, timeout) 的方法来获取未来的最终结果或异常,如果未来未在指定时间范围内完成。