我有可能輸入的值列表斯卡拉平行集合 - 如何提前回報?
val inputValues = List(1,2,3,4,5)
我有一個很長的計算功能,這給了我一個結果
def reallyLongFunction(input: Int) : Option[String] = { ..... }
使用Scala的並行集合,我可以很容易做到
inputValues.par.map(reallyLongFunction(_))
獲得所有結果,並行。問題是,我並不是真的想要所有的結果,我只想要第一個結果。只要我的一個輸入是成功的,我想要我的輸出,並希望繼續我的生活。這做了很多額外的工作。
那麼,我該如何獲得兩全其美?我想
- 獲取返回從我的長期功能
- 停止從無用功我所有的其他線程的東西的第一個結果。
編輯 - 我具有
@volatile var done = false;
被設置和我reallyLongFunction
內檢查解決了這個問題很愚蠢Java程序員。這工作,但不感到非常scala。想更好的辦法來做到這一點....
附註(不是你的問題的答案):這是恕我直言,更簡單:'inputValues.par.map(reallyLongFunction)' –
Similar:http://stackoverflow.com/questions/8073061/filtering-scalas-parallel- collection-with-early-abort-when-desired-number-of-r –
它看起來不像我平行集合或fork-join框架被設計來處理這種情況。如果計算時間長,因爲它是CPU密集型的,那麼想要計算所有結果或拆分內核之間的負載與將所有內核用於計算結果相比似乎是浪費。如果計算時間很長是因爲它正在等待一些IO,那麼看起來未來或演員會更合適。 – huynhjl