首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >即使一个程序遇到错误也会结束的parMapN

即使一个程序遇到错误也会结束的parMapN
EN

Stack Overflow用户
提问于 2019-03-13 06:17:22
回答 2查看 565关注 0票数 0

使用parMapN,可以并行执行多个IO,如下所示:

代码语言:javascript
复制
import cats.implicits._
import cats.effect.{ContextShift, IO}
import scala.concurrent.ExecutionContext

implicit val cs: ContextShift[IO] = IO.contextShift(ExecutionContext.global)

val ioA = IO(for(i <- 1 to 100) { println(s"A$i"); Thread.sleep(100) })
val ioB = IO(for(i <- 1 to 100) { println(s"B$i"); Thread.sleep(100) })
val ioC = IO(for(i <- 1 to 100) { println(s"C$i"); Thread.sleep(100) })

val program = (ioA, ioB, ioC).parMapN { (_, _, _) => () }

program.unsafeRunSync()

示例输出:

代码语言:javascript
复制
A1
C1
B1
A2
C2
B2
A3
C3
B3
A4
C4
B4
A5
B5
C5
A6
B6
C6
A7
B7
C7
A8
...

根据documentation的说法,如果任何IO完成失败,则取消未完成的任务。改变这种机制的最好方法是什么,以便所有的IO都能完成?

在我的例子中,一些IO不返回任何东西(IO[Unit]),我仍然希望确保一切都运行到完成或遇到错误为止。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-13 06:31:46

嗯,我在发布我的问题后不久就找到了一个可能的答案。我不确定这是否是处理这个问题的最好方法,但是像这样定义我的IO对我来说很有效:

代码语言:javascript
复制
val ioA = IO(for(i <- 1 to 100) { println(s"A$i"); Thread.sleep(100) }).attempt
val ioB = IO(for(i <- 1 to 100) { println(s"B$i"); Thread.sleep(100) }).attempt
val ioC = IO(for(i <- 1 to 100) { println(s"C$i"); Thread.sleep(100) }).attempt
票数 1
EN

Stack Overflow用户

发布于 2021-07-10 04:22:00

据我所知,您的示例代码没有引起任何错误。所以你应该有一个像下面这样的代码才能看到这个特性:

代码语言:javascript
复制
val ioA = IO(for(i <- 1 to 100) { println(s"A$i"); Thread.sleep(100) })
val ioB = IO.raiseError[Unit](new Exception("boom"))
val ioC = IO(for(i <- 1 to 100) { println(s"C$i"); Thread.sleep(100) })

而且它看起来不是很好,因为attempt函数会将内部结构更改为IO[Either[_,_]],这似乎不是您想要的,不是吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55131466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档