如何 运行 Scalaz 并行执行任务
How to run Scalaz Tasks in parallel
我有一堆 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 把线程带到哪里去运行 上?
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
.
的第二个参数列表中明确提供一个
我有一堆 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 把线程带到哪里去运行 上?
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
.