2
我正在使用AWS SDK访问S3中的文件。但是,AWS SDK的S3操作是同步的。是否有可能包装这样的同步操作,使它们在Scala中是异步的?如何将Scala中的阻塞IO封装为非阻塞
Wrapping with Future不是正确答案,因为该操作会在另一个线程中阻塞。
我正在使用AWS SDK访问S3中的文件。但是,AWS SDK的S3操作是同步的。是否有可能包装这样的同步操作,使它们在Scala中是异步的?如何将Scala中的阻塞IO封装为非阻塞
Wrapping with 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 } }
}
所以,如你所说 - 是的,期货可能会阻止,这就是为什么我们使用特殊blocking
结构。
更多关于这:
从它说'blocking'构建体“用来指定的一段代码,其潜在地阻断文档,允许电流BlockContext来调整运行时的行为,正确标记阻塞代码可以提高性能或避免死锁。“你知道代码阻塞时会做什么吗? BlockingContext意味着什么来调整运行时的行为? – Khanetor
你是否检查过我发布的链接?他们真的很有帮助,特别是谷歌小组的讨论。之后会很清楚。 – sap1ens
为了给答案增加更多的细节,'blocking'结构将发信号通知ExecutionContext代码可能被阻塞,这样'ExecutionContext'可以暂时***产生比配置更多的线程。这在“学习与Scala并发”一书中的第4章“异步计算中的阻塞”一节中有详细介绍。 – Khanetor