2015-07-05 117 views
2

我正在使用AWS SDK访问S3中的文件。但是,AWS SDK的S3操作是同步的。是否有可能包装这样的同步操作,使它们在Scala中是异步的?如何将Scala中的阻塞IO封装为非阻塞

Wrapping with Future不是正确答案,因为该操作会在另一个线程中阻塞。

回答

1

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

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结构。

更多关于这:

+0

从它说'blocking'构建体“用来指定的一段代码,其潜在地阻断文档,允许电流BlockContext来调整运行时的行为,正确标记阻塞代码可以提高性能或避免死锁。“你知道代码阻塞时会做什么吗? BlockingContext意味着什么来调整运行时的行为? – Khanetor

+0

你是否检查过我发布的链接?他们真的很有帮助,特别是谷歌小组的讨论。之后会很清楚。 – sap1ens

+1

为了给答案增加更多的细节,'blocking'结构将发信号通知ExecutionContext代码可能被阻塞,这样'ExecutionContext'可以暂时***产生比配置更多的线程。这在“学习与Scala并发”一书中的第4章“异步计算中的阻塞”一节中有详细介绍。 – Khanetor