有没有办法在Scala中以非阻塞方式复制文件?

时间:2013-10-30 13:17:05

标签: scala nio

我已经检查了java.nio.file.Files.copy但是阻止了一个线程,直到副本完成。是否有任何库允许以非阻塞方式复制文件?我需要同时执行许多这些操作,并且不能阻止这么多线程。

虽然我可以使用非阻塞流自己编写内容,但我宁愿使用经过测试和测试的内容,以确保每次都能正确复制(或检测是否出现问题)。

3 个答案:

答案 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)