我正在使用AWS SDK访问S3中的文件。然而,AWS SDK中的S3操作是同步的。在Scala中是否有可能包装这样的同步操作以使它们异步?
使用Future进行包装不是正确的答案,因为该操作将在另一个线程中阻塞。
我正在使用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
结构。
更多信息:
blocking
结构将会向ExecutionContext
发出信号,表明代码可能会阻塞,因此ExecutionContext
可以临时生成比配置更多的线程。这在《Scala并发编程实战》一书的第4章“异步计算中的阻塞”一节中有详细介绍。 - Khanetor