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

Exp*_*rer 3 akka-stream

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

如果有人可以用一个真实的例子向我解释这一点,那么它将有助于在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)
Run Code Online (Sandbox Code Playgroud)

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

None
Some(Success(55))
Run Code Online (Sandbox Code Playgroud)

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

由于可以多次实现一个流,因此对于每个这样的实现,也将重新计算实现值,通常会导致每次返回不同的值。在下面的示例中,我们创建了两个在runnable变量中描述的流的正在运行的实例化实例,并且即使我们使用相同的接收器来引用future,这两个实例化也为我们提供了与地图不同的Future。

我在这里有2个问题:1)为什么同一图的2个不同的实例化实例具有2个不同的输出值?尽管物化值是两次计算的,但在幕后两个计算都是针对同一图形的。

2)为什么对于成功执行和失败案例,返回类型Some(Success(55))不是普通类型?(这可能是愚蠢的问题,但我想了解这个特殊的返回值解决/提供了什么问题/优势。)55Failure Exception

Vla*_*eev 5

(评论的答案)我不确定我是否完全理解您的问题,但是通常流是异步的,并且当您执行run()以实现一个流时,它开始在另一个线程池中执行。因此,即使该流立即终止,也不能保证该值将立即可用。这就是为什么的结果Sink.foldFuture[T]-这将是可用的“未来”期货手段的价值观,而这也正是其在这里需要的语义。

“为什么...具有2个不同的值”-正是由于异步性。在您的情况下,您碰巧发现第二个未来已经完成,但是第一个没有完成。如果您多次运行此程序,则可能会得到不同的结果。

“为什么回报类型是Some(Success(55))……”好吧,这就是Scala期货的设计方式。该Future.value方法返回Option[Try[T]],也就是说,它返回None如果未来不是在调用的瞬间完成,Some(v)如果完成,其中v要么是Success(result)Failure(throwable)。通常,在Scala中,将错误视为值而不是抛出异常时会隐式展开调用堆栈的异常是惯用法。

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