如何并行运行Scalaz任务

时间:2016-10-11 18:03:51

标签: multithreading scala parallel-processing scalaz

我有一堆Scalaz任务。像这样创建:

val tasks = for (i <- 1 to 50) yield {
  Task.delay({
    Thread.sleep(100L)
    println(i)
    i
  })
}

val r = Nondeterminism[Task].gatherUnordered(tasks).run
println(r.mkString(" "))

我希望这些任务能够并行运行。以随机顺序打印数字,而不是花费5秒钟(每次有50个任务和100毫秒睡眠)。

但是,显然每个任务需要100毫秒,所有任务都需要5秒,并且已创建列表。

如何并行运行它们? Task在哪里运行线程?

1 个答案:

答案 0 :(得分:3)

Task.delay暂停对其论点的评估,但它没有说明评估将在何处发生。你想要Task.apply,它具有相同的签名,除了它采用一个隐式的ExecutorService来决定评估将在哪个线程中发生:

import scalaz.Nondeterminism, scalaz.concurrent.Task

val tasks = for (i <- 1 to 50) yield {
  Task {
    Thread.sleep(100L)
    println(i)
    i
  }
}

val r = Nondeterminism[Task].gatherUnordered(tasks).run
println(r.mkString(" "))

这将使用默认的ExecutorService,它包装一个固定的线程池。如果您想要一个不同的策略,您可以将不同的ExecutorService放入隐式范围,或者在Task.apply的第二个参数列表中明确提供一个。