- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试并行运行多个任务,但这些任务是独立的,因此如果其中一个子协程失败,我不希望它的 sibling 或父协程也失败。在下面的代码中,我使用 coroutineScope 创建了一个新的范围,这些任务在其中运行并启动了 5 个异步任务,每个任务发送它的 id 和它应该等待的延迟时间。第二个协程抛出异常。在这种情况下,代码执行我希望它执行的操作,它计算成功完成的作业和失败返回 0 的作业的总和。
但是,我读到 kotlinx 库中也有 supervisorScope,它应该是首选而不是 coroutineScope(如果不处理异常,它会取消父/兄弟),因为任务不依赖于其他任务。我不确定为什么我应该改为使用 supervisorScope,因为我正在使用 coroutineScope 获得我想要的结果。
Q1:如果我要更改为 supervisorScope,我的异步 block 中是否应该发生一些变化?
Q2:是否接受在异步 block 内捕获任何异常并且不让任何内容传播到其父级?我知道您也可以在 .await() 阶段捕获异常,但这是应该完成的方式吗?
runBlocking {
coroutineScope {
val job1 = async<Int> {
try {
request(1, 1000)
} catch (e: Exception) {
println("Job 1 failed with $e")
0
}
}
val job2 = async<Int> {
try {
request(2, 2000)
throw Exception("cancelling Job 2")
} catch (e: Exception) {
println("Job 2 failed: $e")
0
}
}
val job3 = async {
try {
request(3, 3000)
} catch (e: Exception) {
println("Job 3 failed with $e")
0
}
}
val job4 = async {
try {
request(4, 4000)
} catch (e: Exception) {
println("Job 4 failed with $e")
0
}
}
val job5 = async {
try {
request(5, 5000)
} catch (e: Exception) {
println("Job 5 failed with $e")
0
}
}
val result = job1.await() + job2.await() + job3.await() + job4.await() + job5.await()
println(result.toString())
}
println("Finished")
}
suspend fun request(id: Int, time: Long): Int {
println("Job $id started")
delay(time)
println("Job $id finished")
return id
}
最佳答案
所有协程运行到完成的原因是您在作业 2 本身中捕获
作业 2 抛出的异常,因此它永远不会向上传播 Job
的层次结构,所以什么也不会发生。
但是,如果您在 job2 中删除那个 catch
子句,则 job[1-5] 将始终被取消,无论您是使用 coroutineScope
还是 supervisorScope
。
这是因为 job2.await()
会抛出异常。由于这发生在作业 [1-5] 的父作业中(即在顶部 coroutineScope
/supervisorScope
中),并且由于失败/取消的父作业总是取消子作业, job[1-5] 也将被取消。
A1:不使用coroutineScope
或supervisorScope
,移除coroutineScope
并将东西直接放在下运行阻塞
。
A2:当然允许在 async { }
中捕获异常,以确保它不会在 .await()
中发生如果它适合您的用例。
关于asynchronous - 使用 kotlin 协程并行分解独立异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58418653/
在我的设置中,我试图有一个界面 Table继承自 Map (因为它主要用作 map 的包装器)。两个类继承自 Table - 本地和全局。全局的将有一个可变的映射,而本地的将有一个只有本地条目的映射。
Rust Nomicon 有 an entire section on variance除了关于 Box 的这一小节,我或多或少地理解了这一点和 Vec在 T 上(共同)变体. Box and Vec
我是一名优秀的程序员,十分优秀!