從Java背景來看,在多個線程之間分割多個任務的問題可以很容易地使用ExecutorService並通過該接口提交任務。你會說同樣的方法在Scala世界中有意義嗎?如果是這樣,那裏是否有該API的Scala版本?Scala - 應該使用ExecutorService在線程之間分割工作嗎?
如果不是,您會推薦什麼方法?參與者似乎有點矯枉過正,我會想象他們用於大部分線程通信...
從Java背景來看,在多個線程之間分割多個任務的問題可以很容易地使用ExecutorService並通過該接口提交任務。你會說同樣的方法在Scala世界中有意義嗎?如果是這樣,那裏是否有該API的Scala版本?Scala - 應該使用ExecutorService在線程之間分割工作嗎?
如果不是,您會推薦什麼方法?參與者似乎有點矯枉過正,我會想象他們用於大部分線程通信...
純斯卡拉方式
斯卡拉的併發模型是基於Erlang actor模型。這是一個稍微不同的方法。要充分利用Scala的併發性,請使用類似Akka的東西。基本的使用想法非常簡單。
最簡單的任務是使用Future
(異步操作)。閱讀更多關於這個HERE。 Executors框架不是你應該採取的方法。有很多選項可以實現強大的多線程|排比在斯卡拉應用:
斯卡拉/ Java的互操作方法
演員可能是你用來實現併發的方式急劇變化,和Java沒有缺點存在。所以你仍然可以在Scala應用程序中使用Executor框架進行多線程。
這意味着您將幾乎完全依賴原生Java併發結構,但它會讓您在那裏變更很多。詳細瞭解如何在Scala HERE中做到這一點。
這是一個很好的用例parallel collections(如果任務比較重):
val TasksNumber = 27
val tasks = List.fill(TasksNumber) {() => Thread.sleep(10000) }
tasks.par.map(t => t.apply)
如果你不想去演員路線,那麼你當然可以做到ExecutionContext
和Futures
。只要你有範圍的隱含ExecutionContext
,你可以做這樣的事情,如果你有一組固定的任務,你想同時運行:
val f1 = Future{
//do something here
}
val f2 = Future{
//do something else here
}
val aggFut = for{
f1Val <- f1
f2Val <- f2
} yield (f1Val, f2Val)
aggFut onComplete{
case Success(tup) => //handle success case here
case Failure(ex) => //handle failure here
}
在這個例子中,在Success
錘頭將包含結果依次爲f1和f2。
如果你有一個動態的大量並行任務的運行,你可以做這樣的事情:
val futs = someList.map(item => Future{...})
val aggFut = Future.sequence(futs)
aggFut onComplete{
case Success(list) => //handle success case here
case Failure(ex) => //handle failure here
}
在這種成功的情況下,Success
將包裹從Future
函數返回的任何類型的列表。
最後,如果你想進行一些序列基於集合的異步任務,你可以做這樣的事情:
val fut = for{
val1 <- Future{...}
val2 <- Future{...}
} yield val2
fut onComplete{
case Success(v2) => //handle success case here
case Failure(ex) => //handle failure here
}
在這種情況下,該值val1
將提供給被計算val2
的Future
。這只是真的抓表面。如果你有興趣瞭解更多,你應該檢查出http://docs.scala-lang.org/overviews/core/futures.html
你不覺得這是過度工程嗎? – 2013-04-23 19:21:51
也許你會驚訝地發現scala和akka actors都在下面使用java併發;從@ Bober02寫的他不需要在線程(或者actors)之間進行通信,只是爲了在線程之間並行化一些工作量,因此我聲稱Scala/Akka/Lift演員,甚至Finagle的方法就像使用大錘來破解堅果:1)以上所有系統都會恢復相對較多的設置和代碼,以便爲如此簡單的任務編寫2)他們將花費額外的簿記工作(與ExecutorService相比)您不需要的任務:故障轉移和通信 – 2013-04-23 19:29:53