如何在 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
结构的原因。
更多相关信息:
- Asynchronous IO in Scala with futures
- https://groups.google.com/forum/#!searchin/scala-user/futureblocking/scala-user/LKiVD2PGvew/XDT-UZrAjJcJ
我正在使用 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
结构的原因。
更多相关信息:
- Asynchronous IO in Scala with futures
- https://groups.google.com/forum/#!searchin/scala-user/futureblocking/scala-user/LKiVD2PGvew/XDT-UZrAjJcJ