2013-09-24 154 views
3

阻止壞,異步好,但阻止未來仍阻止?這是我不斷回來的東西;考慮下面的僞代碼:阻擋未來嗎?

def queryName(id:Id):Future[String] 
def queryEveryonesNames:Future[Seq[String]] = { 
    val everyonesIds:Future[Seq[Id]] = getIds 
    val everyonesNames:Future[Seq[Future[String]]] = { 
    everyonesIds.map(seq.map(id=>queryName(id))) 
    } 
    // I'm trying to understand the impact of what I'll do below 
    everyonesNames.map(seq=>seq.map(fut=>blocking(fut, 1 s))) 
} 
queryEveryonesNames 

在最後一行中我轉向Future[Seq[Future[String]]]內未來阻斷Future[Seq[String]](內未來注意到未來)。

對未來的封鎖感到多餘,至少在這裏,至少在這裏,未來的未來也是多餘的。

你能否提出一種擺脫內在未來的更聰明的方法?

您是否認爲阻礙未來內部的未來並不好?如果是這樣,爲什麼在什麼情況下?

回答

8

是的,未來的阻塞是阻塞的,您應該避免這種情況,因爲資源將被阻塞以等待結果,即使它們位於另一個線程中。
如果我理解正確,你的問題是如何以非阻塞的方式將Future[Seq[Future[String]]]轉換爲Future[Seq[String]]

你可以做到這一點的,內涵:

val in = Future[Seq[Future[String]]] 
val m = for(a <- in) // a is Seq[Future[String]] 
yield (Future.sequence(a)) // yields m = Future[Future[Seq[String]]] 
val result = for(a <- m; b <- a) yield (b) // yields Future[Seq[String]] 

編輯: 或者只是:

val result = in.flatMap(a => Future.sequence(a)) 
+2

你應該得到相同的結果只用'in.flatMap(Future.sequence )' – paradigmatic

+0

@paradigmatic,謝謝!編輯補充說。 –

+0

「未來」伴侶對象有一些非常有用的方法,謝謝你介紹它。乾杯! –