我已经检查过了java.nio.file.Files.copy
,但这会阻塞一个线程,直到复制完成。是否有任何库允许以非阻塞方式复制文件?我需要同时执行许多这些操作,并且不能承受这么多线程阻塞。
虽然我可以使用非阻塞流自己编写一些东西,但我宁愿使用经过尝试和测试的东西,以保证每次都正确复制(或检测是否出现问题)。
检查这一点:并行迭代文件中的行(Scala)?
val chunkSize = 128 * 1024
val iterator = Source.fromFile(path).getLines.grouped(chunkSize)
iterator.foreach { lines =>
lines.par.foreach { line => process(line) }
}
并行读取(复制)文件。在这种情况下par
,使用“”。
因此,就处理器(内核)的范围/范围而言,它非常无阻塞。
但是您可能会遵循相同的块概念,例如使用Akka
/ Future
/Promises
甚至在更广泛的范围内。
您可以根据chunk-size
自己的性能特征、系统负载水平等进行定制。
另一个链接解释了read / write
使用Akka Actors
. 这并不完全是您可能想要的,但它可能会给出一个想法。
想法 - 您可以构建自己的非阻塞方式来读取/复制文件。
--
关于你的陈述"While I could write something myself using non-blocking streams"
:
我要提醒的是,每个操作系统/文件系统 (FS) 可能对要阻止的内容和位置有自己的看法。就像 Windows 会在一个线程写入文件时阻止文件(至少是写块)。在 Linux 上是可配置的。因此,如果您想坚持一些稳定的东西,我建议您考虑一下并使用您自己的基于事件、块、状态的包装器(通过 FS)解决方案。
我已经使用了这个Process
类,发出一个操作系统命令来复制文件。当然,必须检查应用程序在哪个操作系统下运行,并发出适当的命令,但这允许快速和异步复制。
正如 Marius 在评论中正确提到的那样,ScalaProcess
阻塞了,所以我将它包装在 Future 中运行。
Java 8Process
引入了一个函数isAlive()
。一个非阻塞的替代方法是使用 Java 8 进程并使用调度程序定期轮询以查看进程是否已完成。不过,我没必要走到这一步。
你检查过 scala-io 中的异步内容吗? http://jesseeichar.github.io/scala-io-doc/0.4.2/index.html#!/core/async%20read%20write