gpt4 book ai didi

java - Scala 中的非阻塞读取,无需框架

转载 作者:太空宇宙 更新时间:2023-11-04 12:20:12 24 4
gpt4 key购买 nike

使用标准 java java.io.DataInputStream 可以读取异构二进制数据,例如:

  val stream = new DataInputStream(???)
val i = stream.readInt()

if (i > 5) {
val string = stream.readUTF()
???
} else {
val long = stream.readLong()
???
}

没什么问题,只是它会消耗整个线程,因此在高负载服务器中没有用。

是否可以为 Scala 找到/制作一些看起来像这样但非阻塞的 API?

当然有 Netty 的 ByteBuf,但它们需要像 LengthFieldBasedFrameDecoder 这样的框架,以确保在我开始读取数据之前已经接收到所有数据,并且在我的情况下,传入数据包不包含长度,因此在完全解析数据包之前不可能知道数据包的长度。对于这种情况确实存在一个 ReplayingDecoder,但它的性能不是很有希望。

我正在考虑的解决方案是将 Netty 处理程序包装在类似的内容中:

  trait NonBlockingReader {

def readInt: Future[Int]

def readUTF: Future[String]

def readLong: Future[Long]

//...

}

然后可以这样使用:

  val source: NonBlockingReader = ???

val someResult: Future[Any] = for (
i <- source.readInt;
r <- if (i > 6) source.readUTF else source.readLong
) yield r

方便,好看,而且不需要框架,但我想知道这不是一个开销吗?我不是在重新发明轮子吗?

最佳答案

Scala 没有为非阻塞文件 IO 提供显式 API,但是在这些情况下使用普通 Java API 正是正确的选择。您应该考虑使用 java.nio.channels.AsynchronousFileChannel 或 Java NIO Api。

关于java - Scala 中的非阻塞读取,无需框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38930361/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com