簡體   English   中英

對期貨做出反應

[英]React for futures

我試圖使用分而治之(又稱fork / join)方法來解決數字運算問題。 這是代碼:

import scala.actors.Futures.future

private def compute( input: Input ):Result = {
  if( pairs.size < SIZE_LIMIT ) {
    computeSequential()
  } else {
    val (input1,input2) = input.split
    val f1 = future( compute(input1) )
    val f2 = future( compute(input2) )
    val result1 = f1()
    val result2 = f2()
    merge(result1,result2)
  }
}

它運行(具有良好的加速)但未來的apply方法似乎阻塞了一個線程,並且線程池大大增加。 並且當創建太多線程時,計算被卡住。

是否存在一種釋放線程的期貨反應方法? 或任何其他方式來實現這種行為?

編輯:我使用scala 2.8.0.final

不要求(申請)你的Future ,因為這迫使他們阻止並等待答案; 正如你所見,這可能會導致死鎖。 相反,單獨使用它們告訴他們完成后該怎么做。 代替:

val result1 = f1()
val result2 = f2()
merge(result1,result2)

嘗試這個:

for {
  result1 <- f1
  result2 <- f2
} yield merge(result1, result2)

結果將是包含合並結果的Responder[Result] (基本上是Future[Result] ); 你可以使用response respond()foreach() respond()這個最終值做一些有效的事情,或者你可以將map()flatMap() map()到另一個Responder[T] 不需要阻止,只需保持計划未來的計算!

編輯1:

好的, compute功能的簽名現在必須更改為Responder[Result] ,那么這對遞歸調用有何影響? 我們試試這個:

private def compute( input: Input ):Responder[Result] = {
  if( pairs.size < SIZE_LIMIT ) {
    future(computeSequential())
  } else {
    val (input1,input2) = input.split
    for {
      result1 <- compute(input1)
      result2 <- compute(input2)
    } yield merge(result1, result2)
  }
}

現在你不再需要用future(...)包含對compute的調用,因為它們已經返回ResponderFuture的超類)。

編輯2:

使用這種延續傳遞方式的一個結果是,您的頂級代碼 - 無論是最初的compute調用 - 都不再阻止。 如果它是從main()調用的,並且這是所有程序所做的,這將是一個問題,因為現在它只會產生一堆未來,然后立即關閉,完成它被告知要做的所有事情。 您需要做的是block所有這些未來,但只在頂級,只在所有計算的結果,而不是任何中間的結果。

不幸的是,這個被compute()返回的Responder事件不再像Future那樣有一個阻塞的apply()方法。 我不確定為什么flatMapping Future會生成一個通用的Responder而不是Future 這似乎是一個API錯誤。 但無論如何,你應該能夠自己創造:

def claim[A](r:Responder[A]):A = {
  import java.util.concurrent.ArrayBlockingQueue
  import scala.actors.Actor.actor

  val q = new ArrayBlockingQueue[A](1)
  // uses of 'respond' need to be wrapped in an actor or future block
  actor { r.respond(a => q.put(a)) } 
  return q.take
}

所以現在你可以在main方法中創建一個阻塞調用來計算,如下所示:

val finalResult = claim(compute(input))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM