我正在开发的应用程序需要/使用户能够在运行时创建和定义任意流。据我所知,尤其是在Akka流中
实现=执行或运行
我的问题
1)流的具体化应该只进行一次吗?即如果它已经实现,那么我可以将该值用于后续运行吗?
2)如上所述,也许我误解了物化这个词。如果必须运行一个流,那么它每次都会实现吗?
我感到困惑,因为在文档中,它说物化实际上创造了流执行所需的资源。所以我的理解是它必须只做一次。就像与数据库的JDBC连接一样。有人可以用非akka术语解释。
答案 0 :(得分:0)
是的,可以多次实现流。是的,如果一个流多次运行,它每次都会实现。来自documentation:
由于流可以多次实现,因此每个这样的实现也将重新计算实现值,通常导致每次返回不同的值。在下面的示例中,我们创建了我们在
runnable
变量中描述的流的两个正在运行的物化实例,并且即使我们使用了相同的{{1},这两个实现也为我们提供了与地图不同的Future
引用未来:sink
将流视为可重复使用的蓝图,可以多次运行/实现。物化器需要具体化,Akka Streams提供了一个名为// connect the Source to the Sink, obtaining a RunnableGraph
val sink = Sink.fold[Int, Int](0)(_ + _)
val runnable: RunnableGraph[Future[Int]] =
Source(1 to 10).toMat(sink)(Keep.right)
// get the materialized value of the FoldSink
val sum1: Future[Int] = runnable.run()
val sum2: Future[Int] = runnable.run()
// sum1 and sum2 are different Futures!
的物化器。物料化器分配必要的资源(演员等)并执行流。虽然通常对不同的流和多个实现使用相同的物理化器,但流的每个实现都会触发运行流所需的资源分配。在上面的示例中,ActorMaterializer
和sum1
使用相同的蓝图(sum2
)和相同的材质大小,但它们是产生不同资源分配的不同实现的结果。