【问题标题】:How to run Scalaz Tasks in parallel如何并行运行 Scalaz 任务
【发布时间】:2016-10-11 18:03:51
【问题描述】:

我有一堆 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 在哪里运行线程?

【问题讨论】:

    标签: multithreading scala parallel-processing scalaz


    【解决方案1】:

    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 的第二个参数列表中显式提供一个。

    【讨论】:

      猜你喜欢
      • 2015-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 2021-12-02
      • 1970-01-01
      • 2017-03-10
      • 2020-06-21
      相关资源
      最近更新 更多