以下代码将逐行读取文件,为每一行创建一个任务,然后将其排队到执行程序。如果执行程序的队列已满,则从文件读取将停止,直到再次出现空间为止。
我在SO中查看了一些建议,但是他们都要求将文件的全部内容读入内存,或者次优调度(例如,读取100行,并行处理它们,只有在完成之后,才能读取下一个100行)。我也不想使用像Akka这样的库。
实现这一目标的Scala方法是什么,没有这些缺点?
$
val exec = executorWithBoundedQueue()
val lines = Source.fromFile(sourceFile, cs).getLines()
lines.map {
l => exec.submit(new Callable[String] {
override def call(): String = doStuff(l)
})
}.foreach {
s => consume(s.get())
}
exec.shutdown()
executorWithBoundedQueue