试图掌握 ZIO

Posted

技术标签:

【中文标题】试图掌握 ZIO【英文标题】:Trying to get to grips with ZIO 【发布时间】:2021-10-09 19:02:12 【问题描述】:

我只是想学习 ZIO,一切都很顺利,直到我最终得到 Seq[URIO[Any, Fiber.Runtime[Throwable, Unit]]] - 我不太确定如何处理 - 我的 Fiber 都没有运行,可能是因为我需要评估每个URIO,但如果是这种情况,我该如何在zio.App 中做到这一点?我尝试过对序列进行映射,但后来我似乎一直以Seq[Nothing]...

我尝试将 Seq 包装在效果中,但这似乎对我没有帮助。我查看了 ZIO 网站上的示例,但它们不处理纤维列表,所以现在我迷路了......

编辑

好的 - 我想我的问题是:如何运行效果列表?

package testmesomemore

import zio._
import zio.console._
import zio.internal.Platform

import java.io.IOException

case class testme(
                   s: String,
                   n: Int,
                   l: String) 
  def runme() = UIO.effectTotal 
    println(s"$s$l")
  


object mytest extends zio.App 

  override val platform: Platform = zio.Runtime.default.platform.withReportFailure(_ => ())
  def run(args: List[String]) = 

    val testlist: Seq[testme] = List[testme](testme("Hi there", 1, "."), testme("This is a test", 3, "..."))

    val result = for 

      // r <- testlist.map(d => d.runme().forkDaemon) // How to run a list of effects?

      a <- testme("Hi there", 1, ".").runme().forkDaemon
      b <- testme("This is a test", 3, "...").runme().forkDaemon

     yield()

    result.exitCode
  

我可以单独 fork 效果,但如果我有一份它们的列表,我将如何将它们全部 fork?

我想我一直在看这个太久了,现在没有任何意义......对不起,如果我是昏暗的,错过了明显的?

【问题讨论】:

您可能想要某种traverse,而不是某处的map。但是 ZIO 不使用标准名称,我相信他们将其命名为 ZIO.foreach 或类似的名称。 你能发个minimal reproducible example吗? 【参考方案1】:

除非您对管理纤程有特殊需要,否则只需使用 Zio.foreach 或 ZIO.foreachPar 进行并行处理,就像这样

ZIO.foreachPar(testlist)(_.runme()).exitCode

【讨论】:

以上是关于试图掌握 ZIO的主要内容,如果未能解决你的问题,请参考以下文章

试图掌握核心数据中的关系

XML - 试图掌握命名空间 URI 的概念

掌握递归关系时间复杂度的定理

如何使用 ZIO(具有持久层)创建具有“传统”接口的小型库

linux常见的几种压缩命令tar,gz,zio,bz2

text zio-waitq-runq-lat-counts-with-time-csv.d的实验版本