我已经成功使用FileIO来传输文件的内容,为每一行计算一些转换并聚合/减少结果。
现在我有一个非常具体的用例,我希望在达到条件时停止流,这样就不必读取整个文件,但过程会尽快完成。推荐的方法是什么?
答案 0 :(得分:19)
有一个名为KillSwitch
的高级构建块可用于执行此操作:http://doc.akka.io/japi/akka/2.4.7/akka/stream/KillSwitches.html一旦通知了kill开关,流将关闭。
它有abort(reason)
/ shutdown
等方法,请参阅此处的API:http://doc.akka.io/japi/akka/2.4.7/akka/stream/SharedKillSwitch.html
参考文档在此处:http://doc.akka.io/docs/akka/2.4.8/scala/stream/stream-dynamic.html#kill-switch-scala
示例用法是:
val countingSrc = Source(Stream.from(1)).delay(1.second,
DelayOverflowStrategy.backpressure)
val lastSnk = Sink.last[Int]
val (killSwitch, last) = countingSrc
.viaMat(KillSwitches.single)(Keep.right)
.toMat(lastSnk)(Keep.both)
.run()
doSomethingElse()
killSwitch.shutdown()
Await.result(last, 1.second) shouldBe 2
您可以使用takeWhile
来表达任何条件,但有时候take
或limit
也可能足够“占用10 lnes”。
如果您的逻辑非常先进,您可以构建一个特殊的阶段,使用statefulMapConcat
处理该特殊逻辑,允许表达任何内容 - 因此您可以随时“从内部”完成流。