我试图创建一个我可以通过类似Iterator
之类的东西来消费的流程。
我实现了一个公开类似迭代器的接口的库,所以这对我来说是最简单的事情。
到目前为止我设计的图表基本上是Source<Iterator<DataRow>>
。到目前为止我看到的一件事是将其展平为Source<DataRow>
,然后使用http://doc.akka.io/japi/akka/current/akka/stream/javadsl/StreamConverters.html#asJavaStream--后跟https://docs.oracle.com/javase/8/docs/api/java/util/stream/BaseStream.html#iterator--
但考虑到可能会有很多行,我想知道是否有必要避免扁平步骤(至少在akka流的背景下,我假设那里有's'。通过阶段传递时,每个元素的一些小的开销,或者是否有更直接的方式。
另外,我很好奇背压在创建的流中是如何工作的,尤其是儿童迭代器;它只缓冲一个元素吗?
答案 0 :(得分:1)
展平步骤
将Source<Iterator<DataRow>>
展平为Source<DataRow>
会增加一些开销,因为您必须使用最终flatMapConcat
的create a new GraphStage
。
然而,如果你有很多&#34;行然后这个单独的阶段可能派上用场,因为它将为展平步骤提供并发性。
<强>背压强>
如果您查看StreamConverters.asJavaStream
的{{3}},您会看到有一个QueueSink
正在产生一个Future来从akka流中提取下一个元素,然后执行Await.result(nextElementFuture, Inf)
等待Future完成,以便下一个元素可以转发到java Stream。
回答你的问题:是的,子迭代器只缓冲一个元素,但QueueSink有一个Future,也可能有下一个DataRow
。因此javaStream&amp;迭代器可能有2个缓冲元素,但是在原始的akka Source
中进行了很多缓冲。