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_
我有两个程序的实现
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_