FlowOps.delay的行为不清楚

时间:2018-01-05 20:04:58

标签: scala akka-stream

我试图通过尝试两天的代码来理解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秒和一个元素打印的元素。

0 个答案:

没有答案