2013-04-23 79 views
3

從Java背景來看,在多個線程之間分割多個任務的問題可以很容易地使用ExecutorService並通過該接口提交任務。你會說同樣的方法在Scala世界中有意義嗎?如果是這樣,那裏是否有該API的Scala版本?Scala - 應該使用ExecutorService在線程之間分割工作嗎?

如果不是,您會推薦什麼方法?參與者似乎有點矯枉過正,我會想象他們用於大部分線程通信...

回答

3

純斯卡拉方式

斯卡拉的併發模型是基於Erlang actor模型。這是一個稍微不同的方法。要充分利用Scala的併發性,請使用類似Akka的東西。基本的使用想法非常簡單。

最簡單的任務是使用Future(異步操作)。閱讀更多關於這個HERE。 Executors框架不是你應該採取的方法。有很多選項可以實現強大的多線程|排比在斯卡拉應用:

  1. Akka
  2. Lift演員(使用電梯Web框架時)。
  3. Finagle(Twitter RPC框架)。
  4. 默認的斯卡拉演員庫,Scala 2.10中的DEPRECATED。閱讀更多HERE

斯卡拉/ Java的互操作方法

演員可能是你用來實現併發的方式急劇變化,和Java沒有缺點存在。所以你仍然可以在Scala應用程序中使用Executor框架進行多線程。

這意味着您將幾乎完全依賴原生Java併發結構,但它會讓您在那裏變更很多。詳細瞭解如何在Scala HERE中做到這一點。

+0

你不覺得這是過度工程嗎? – 2013-04-23 19:21:51

+0

也許你會驚訝地發現scala和akka actors都在下面使用java併發;從@ Bober02寫的他不需要在線程(或者actors)之間進行通信,只是爲了在線程之間並行化一些工作量,因此我聲稱Scala/Akka/Lift演員,甚至Finagle的方法就像使用大錘來破解堅果:1)以上所有系統都會恢復相對較多的設置和代碼,以便爲如此簡單的任務編寫2)他們將花費額外的簿記工作(與ExecutorService相比)您不需要的任務:故障轉移和通信 – 2013-04-23 19:29:53

1

這是一個很好的用例parallel collections(如果任務比較重):

val TasksNumber = 27 
val tasks = List.fill(TasksNumber) {() => Thread.sleep(10000) } 
tasks.par.map(t => t.apply) 
3

如果你不想去演員路線,那麼你當然可以做到ExecutionContextFutures。只要你有範圍的隱含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將提供給被計算val2Future 。這只是真的抓表面。如果你有興趣瞭解更多,你應該檢查出http://docs.scala-lang.org/overviews/core/futures.html

相關問題