scala - 如何与ZIO并行优雅地执行多种效果

标签 scala scalaz zio

我知道我可以用

import zio.Task

def zip3Par[A, B, C](a: Task[A], b: Task[B], c: Task[C]): Task[(A, B, C)] =
  a.zipPar(b).zipWithPar(c) { case ((a, b), c) => (a, b, c) }

def zip4Par[A, B, C, D](a: Task[A], b: Task[B], c: Task[C], d: Task[D]): Task[(A, B, C, D)] =
  zip3Par(a, b, c).zipWithPar(d) { case ((a, b, c), d) => (a, b, c, d) }

并行执行3或4个任务,但是如果有更好的解决方案,我会更受伤吗?

最佳答案

您可以只将ZIO.collectAllPar与任务列表一起使用:

def collectTasks(tasks: Task[Int]*):Task[List[Int]] = ZIO.collectAllPar(tasks)

然后,您可以像这样使用它:
val t1 = Task.effect{
  Thread.sleep(100)
  println("t1 started")
  Thread.sleep(1000)
  1
}

val t2 = Task.effect{
  println("t2 started")
  Thread.sleep(1000)
  2
}


val t3 = Task.effect{
  println("t3 started")
  Thread.sleep(1000)
  3
}

(new DefaultRuntime() {}).unsafeRun(collectTasks(t1,t2,t3))

它将同时运行您的所有任务。

如果没有整形,那么在Scala 2中很难使用元组而不是列表来实现通用解决方案。它会在Scala 3中发生变化,因为那样的话它们可以作为异构列表来处理。

关于scala - 如何与ZIO并行优雅地执行多种效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57017129/

相关文章:

java - 无需再次读取文件即可获取全局变量的值

scala - 如何将 Future 的分离转换为分离的 Future

scala - 如果 A 和 B 是单子(monad),如何将 A[B[C]] 转换为 B[A[C]]?

scala - 找不到 Ordered[T] 类型的证据参数的隐式值

Scala Hoogle 相当于什么?

Scala 错误 : ';' expected but 'import' found

stream - 如何组合多个 Scalaz-Streams 以保留完成顺序但不强制交错?

java - 带有 Scala IO 实现的 JVM 上的光纤

Scala with cats 在 Kleisli 上进行数据验证,为什么我的代码很快失败而不是累积错误?

scala - Zio 运行阻止向后兼容的代码