如何将Scala中的阻塞IO包装为非阻塞IO

4

我正在使用AWS SDK访问S3中的文件。然而,AWS SDK中的S3操作是同步的。在Scala中是否有可能包装这样的同步操作以使它们异步?

使用Future进行包装不是正确的答案,因为该操作将在另一个线程中阻塞。

1个回答

3

我使用已经有一段时间的东西:

import scala.concurrent.{blocking, Future, ExecutionContext}
/**
 * This is an idiomatic way of executing blocking code
 * Use BlockingFuture(...) instead of normal Future(...) anywhere
 */
object BlockingFuture {
    def apply[T](body: => T)(implicit execctx: ExecutionContext): Future[T] = Future { blocking { body } }
}

所以,正如你所说的-是的,Futures可能会阻塞,这就是为什么我们使用特殊的blocking结构。

更多信息:


从文档中可以看到,“blocking”结构用于指定可能会阻塞的代码块,允许当前的BlockContext调整运行时的行为。正确标记阻塞代码可以提高性能或避免死锁。您知道当代码被阻塞时它会做什么吗?什么是BlockingContext调整运行时行为的意思? - Khanetor
你有看过我发的那些链接吗?它们非常有帮助,特别是 Google Group 的讨论。看完后会更加清晰明了。 - sap1ens
1
为了给答案增加更多细节,blocking结构将会向ExecutionContext发出信号,表明代码可能会阻塞,因此ExecutionContext可以临时生成比配置更多的线程。这在《Scala并发编程实战》一书的第4章“异步计算中的阻塞”一节中有详细介绍。 - Khanetor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接