9

我有相当大的文件需要处理(500Meg+ zip 文件)。

Scala 的 actor 是否有任何非阻塞 IO 开源实现?

4

4 回答 4

6

如果我的问题是正确的,那么您需要对文件进行非阻塞 IO。那我有个坏消息要告诉你。

蔚来

Java6 中的 Java NIO 仅在处理文件时支持阻塞操作。FileChannel您可能会从没有实现SelectableChannel接口的事实中注意到这一点。(NIO 确实支持套接字的非阻塞模式)

NIO.2 ( JSR-203 ) 规范旨在克服 java.io 和 NIO 的许多当前限制,并为文件上的异步 IO 提供支持。据我了解,NIO.2 将与 Java 7 一起发布。

这些是 Java 库的限制,因此您在 Scala 中也会受到这些限制。

演员

Actors 基于 Doug Lea 的 Fork-Join 框架(至少在分支 2.7.x 到版本 2.7.7中)。FJTask的一句话:

实际上没有什么可以阻止您在 FJTask 中阻塞,并且非常短的等待/阻塞完全表现良好。但是 FJTask 的设计并不支持任意同步,因为一旦单个任务开始执行,就无法暂停和恢复它们。FJTasks 的持续时间也应该是有限的——它们不应该包含无限循环。FJTasks 可能需要执行阻塞操作,或长时间持有锁,或永远循环,而可以创建普通的 java Thread 对象来执行此操作。FJTasks 并不是为了支持这些东西而设计的。

FJ 库在 Scala 中得到了增强,提供了一种统一的方式,允许参与者根据工作线程的数量和“库活动”(您可以在技术报告“统一线程的参与者”中找到解释)像线程或像基于事件的任务一样运行和事件”由 Philipp Haller 和 Martin Odersky 撰写)。

解决方案?

但是毕竟如果你在一个actor中运行阻塞代码,它的行为就像它是一个线程一样,那么为什么不使用普通Thread的阻塞读取并将事件从这个线程发送到基于事件的actor呢?

于 2009-10-06T07:40:51.410 回答
1

你说的是远程演员吗?标准Actor当然是 JVM 内的实体。恐怕我不知道远程参与者的 NIO 实现。

于 2009-10-03T17:22:26.527 回答
1

你好,这是你的选择吗?bigdata(R) 是一种横向扩展的存储和计算结构,支持可选事务、非常高的并发性和非常高的聚合 IO 速率。

http://sourceforge.net/projects/bigdata/

于 2009-10-05T19:14:20.817 回答
1

不是我所知道的,但是您可能会从 Naggati 中获得很多信息,Naggati是 Apache Mina 周围的 Scala 包装器。Mina 是一个使用 NIO 的网络库,Naggati 将其转换为 Scala 编码风格。

于 2009-10-06T07:58:33.217 回答