parSequence 和手动启动光纤之间的区别

Difference between parSequence and starting fibers manually

我有两个程序的实现

def program_valid: IO[Unit] = for {
    interpreter <- Interpreter[IO]
    fib1 <- display(interpreter).start
    fib2 <- read(interpreter).start
    _ <- fib1.join
    _ <- fib2.join
  } yield ()

  def program_invalid: IO[Unit] = for {
    interpreter <- Interpreter[IO]
    _ <- (read(interpreter), display(interpreter)).parSequence
  } yield ()

第一个工作得很好,这意味着两条光纤都保持 运行ning(显示和读取)。不幸的是,第二个实现的工作方式不同。看起来只有显示光纤会 运行。为什么会这样?这里有什么区别?

parSequence 用于集合 (实际上对于具有 Traverse 实例的类型),不确定它是如何编译的;好吧,我的意思是 Tuple2 可能有一个 Traverse 实例,但它肯定不会执行您想要的操作。

您可以使用:

_ <- (read(interpreter), display(interpreter)).parTupled.void
// Or
_ <- IO.both(read(interpreter), display(interpreter)).void
// Or
_ <- read(interpreter).both(display(interpreter)).void
// Or
_ <- List(read(interpreter), display(interpreter)).parSequence_