2013-04-23 45 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

相关问题