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

How to wrap blocking IO in Scala as non blocking

我正在使用 AWS SDK 访问 S3 中的文件。但是,来自 AWS SDK 的 S3 操作是同步的。是否可以包装此类同步操作以使其在 Scala 中异步?

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

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

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 结构的原因。

更多相关信息: