【问题标题】:Does scala offer async non-blocking IO when working with files?scala 在处理文件时是否提供异步非阻塞 IO?
【发布时间】:2015-01-01 21:23:44
【问题描述】:

我正在使用 scala 2.10,我想知道是否有一些包在处理文件时具有异步 IO?

我对这个主题进行了一些搜索,但大部分都找到了以下示例

val file = new File(canonicalFilename)
val bw = new BufferedWriter(new FileWriter(file))
bw.write(text)
bw.close()

本质上是具有阻塞 IO 操作的 java.io 包 - 写入、读取等。我还发现 scala-io 项目有此意图,但似乎该项目是 2012 年最后的活动。

在这种情况下,最佳做法是什么?是否有任何 scala 包或将 java.io 代码包装到 Futures 和 Observables 的常用方法?

我的用例来自一个 Akka actor,需要在本地或远程文件系统上操作文件。需要避免阻塞。还是有更好的选择?

感谢您澄清这一点

【问题讨论】:

  • 您已经在使用 Akka - 发送消息。
  • 是的,发送消息并让另一个演员来做。
  • 这将是异步的,但仍会阻塞。
  • 所有 IO 在某处阻塞。只是让它不阻塞执行线程的问题。
  • 为了说明我的观点——阅读the documentation for AsynchronousFileChannel——它所做的只是将任务提交给ExecutorService。这正是向另一个参与者发送消息会做的事情......

标签: scala akka reactive-programming


【解决方案1】:

Scala 没有为异步文件 IO 提供显式 API,然而在这些情况下使用纯 Java API 是完全正确的(这实际上是件好事,我们可以使用所有这些漂亮的 API 而无需任何包装!)。您应该考虑使用 java.nio.channels.AsynchronousFileChannel,它从 JDK7 开始可用,并利用底层系统异步调用文件 IO。

Akka IO,虽然在其核心中不提供文件 IO,但有一个由 Dario Rexin 开发的模块,它允许以非常简单的方式将 AsynchronousFileChannel 与 Akka IO 一起使用。看看这个库来使用它:https://github.com/drexin/akka-io-file

不久的将来Akka 将在其akka-streams 模块中提供文件 IO。虽然它可能作为一个外部库有一段时间了,我们还不确定把它放在哪里,因为它要求用户至少有 7 个 JDK,而大多数 Akka 目前支持 JDK6。话虽如此,基于流的异步背压文件 IO 即将推出 :-)

【讨论】:

    【解决方案2】:

    如果您将 scalaz-stream 用于异步支持,它具有基于 java.nio 异步 API 构建的 file functionality - 这可能是我推荐的方法。如果您使用标准的 scala 期货,您可以使用akka-io?我认为使用 Netty 作为后端。或者您可以直接调用 NIO - 只需几行代码即可将基于回调的 API 适配到 scalaz 或 scala futures。

    【讨论】:

    • 如果我错了请纠正我,但我的理解是 akka-io 目前只支持 TCP 和 UDP
    • 哦,也许吧。 scalaz-stream 方法是我自己使用的方法,akka-io 只是我从其他人那里听说的。
    • 虽然 Akka IO 不直接实现文件 IO,但可以使用 Dario Rexin 的 akka-io-file 模块来扩展 Akka IO 以便能够使用来自 java.nio 的 AsynchronousFileChannel。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 2014-11-20
    • 2013-05-07
    • 1970-01-01
    • 2015-09-22
    相关资源
    最近更新 更多