我已经检查了java.nio.file.Files.copy
但是阻止了一个线程,直到副本完成。是否有任何库允许以非阻塞方式复制文件?我需要同时执行许多这些操作,并且不能阻止这么多线程。
虽然我可以使用非阻塞流自己编写内容,但我宁愿使用经过测试和测试的内容,以确保每次都能正确复制(或检测是否出现问题)。
答案 0 :(得分:0)
请检查:Iterate over lines in a file in parallel (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
深化您的性能特征,系统负载等级。
另外一个link解释了使用read / write
并行地从(属性)文件执行Akka Actors
数据的可能方法。这可能不是你想要的,但它可能会提出一个想法。
想法 - 您可以构建自己的无阻塞方式来读取/复制文件。
<强> - 强>
关于你的陈述"While I could write something myself using non-blocking streams"
:
我想提醒一下,每个操作系统/文件系统(FS)可能对阻止的内容和位置有自己的看法。就像一个线程写入文件一样,Windows阻止文件(leat写入块)。在Linux上是可配置的。因此,如果你想坚持稳定的东西,我建议你考虑一下,然后根据事件,块,状态,使用你自己的包装器(基于FS)解决方案。
答案 1 :(得分:0)
我使用了Process
类,发出操作系统命令来复制文件。当然,必须检查应用程序运行的操作系统,并发出适当的命令,但这允许快速和异步复制。
正如Marius在评论中正确提到的那样,Scala Process
会阻止,所以我将它包含在未来中。
Java 8 Process
引入了一个函数isAlive()
。非阻塞替代方案是使用Java 8进程并使用调度程序定期轮询以查看进程是否已完成。但是,我没有必要去达到这个程度。
答案 2 :(得分:-1)
您是否检查过scala-io中的异步内容? http://jesseeichar.github.io/scala-io-doc/0.4.2/index.html#!/core/async%20read%20write