2016-04-18 34 views
0

我有n不同的來源,例如,獲得美元兌歐元匯率。讓n = 3和來源是谷歌,雅虎,以及相應的方法MyRates:並行執行多個任務,從第一次完成挑選答案

def getYahooRate:Double = ??? 
def getGoogleRate:Double = ??? 
def getMyRate:Double = ??? 

我要查詢美元對歐元的比率以這樣的方式,所有的n來源並行,併成爲第一個響應輪詢收到的是立即退回。如果沒有人在指定的時間範圍內回覆,則會拋出異常。

什麼是規範的方式來實現這個使用Scala(如果需要Akka)?

是否有任何庫方法可以完成這些工作?

編輯:這是我所嘗試過的。對代碼的一些意見將不勝感激:

這有點像從this SO question的並行版trycatch。對於下面的方法的代碼是基於this SO answer

type unitToT[T] =()=>T 

def trycatchPar[B](list:List[unitToT[B]], timeOut:Long):B = { 
    if (list.isEmpty) throw new Exception("call list must be non-empty") 
    import scala.concurrent.ExecutionContext.Implicits.global 
    import scala.concurrent._ 
    import scala.concurrent.duration._ 
    import scala.util.Failure 
    import scala.util.Success 

    val p = promise[B] 
    val futures = list.map(l => Future{l()}) 
    futures foreach { 
     _ onComplete { 
     case s @ Success(_) => { 
      // Arbitrarily return the first success 
      p tryComplete s   
      } 
     case s @ Failure(_) => 
     } 
    } 
    Await.result(p.future, timeOut millis) 
} 

回答

3

您可以使用Future.firstCompletedOf

val first = Future.firstCompletedOf(futures) 
Await.result(first, timeOut.millis) 
+0

甜和簡單! – Jus12

+0

經過一些試用後,這不像預期的那樣。如果第一個失敗,它會返回,而不是等待成功,不像我粘貼的代碼。 – Jus12