我试图通过尝试两天的代码来理解FlowOps.delay
方法,并且有一点我显然错过了。
因此,请考虑以下代码:
val source = Source(1 to 100)
val flow = Flow[Int].delay(4 second, DelayOverflowStrategy.dropHead)
val sink = Sink.foreach(println)
source
.via(flow)
.to(sink)
.run
我原本期待它等待4秒,然后从(1 to 100)
序列打印出16个数字。它的行为相应,在4秒后延迟打印数字从85到100。
现在,如果我将溢出策略更改为dropTail
,它也会表现得恰当,并打印1,...,15,100之间的数字。
这一切都很好。
现在出现溢出策略dropNew
和以下
val source = Source(1 to 100)
val flow = Flow[Int].delay(4 second, DelayOverflowStrategy.dropNew)
val sink = Sink.foreach(println)
source
.via(flow)
.to(sink)
.run
产生我根本不了解的输出。它等待4秒,然后打印1,2。然后等待4秒并打印3,4。等待4秒并打印5,6。等等。
问题1:为什么dropNew
以这种方式行事?我希望看到4秒的延迟,然后立即打印出1到16的数字。
问题2:如果我将溢出策略设置为backpressure
,则其行为与dropNew
完全相同。为什么?根据我的理解,当延迟正在进行时,它应该消耗前16个元素(因为16是默认的缓冲区大小),然后反压源。然后,当延迟通过时,它应该发出缓冲区的头部,数字1,然后再次延迟,它只消耗一个元素和背压,然后只是循环重复。所以我希望实际上看到每4秒和一个元素打印的元素。