2015-07-05 158 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