使用依赖项执行并发任务的最佳方法

时间:2014-04-17 05:06:40

标签: scala concurrency

我需要执行几项任务。有些人依赖其他任务。 scala.concurrent(或其他库)中是否有任何可以使这更容易的内容?

例如,有四个任务,ABCD。任务A取决于任何内容,任务B取决于任务AD,任务C取决于AB ,任务D取决于什么。给定一个线程池,尽可能尽快做到。

这类似于Make或sbt可以使用依赖图来并行化任务。 (但这些都不合适,因为我没有构建;我正在执行应用程序逻辑,它可以从并发执行中受益。)

3 个答案:

答案 0 :(得分:2)

“A,B,C和D.任务A取决于任何东西,任务B取决于任务A和D,任务C取决于A和B,任务D取决于任何东西。”

val D = Future(…) //D depends on Nothing
val A = Future(…) //A depends on Nothing
val B = A zip D map (…) // B depends on A and D
val C = A zip B map (…) // C depends on A and B

答案 1 :(得分:0)

或许不是您正在寻找的答案,但Disruptor的主要功能之一是处理任务依赖性。它只有在你有固定的任务依赖关系而不是动态任务依赖关系时才有效,因为你需要在开始时设置这个布局。

https://github.com/LMAX-Exchange/disruptor

作为一个很好的奖励,它也非常快。

答案 2 :(得分:0)

我不了解Scala的解决方案,但JVM的其他一些替代方案是:

for Java8:CompletableFuture。使用thenCombine方法实现对2个任务的依赖。小心bug for large dependence graphs

for Groovy:GPARS dataflow

for Java7:dataflow-for-java - 最简洁,易于使用。我专门针对像你这样的任务开发了它。它有2个基类:用于依赖于其他任务的on-time任务(org.df4j.core.func.Function),以及用于重复任务(org.df4j.core.actor.Actor-它就像Akka actor,但是有几个输入端口)。与GPARS相比,它的性能提高了一个数量级(更好的说,数量级更少)。