gpt4 book ai didi

kotlin - 为什么 withContext 等待子协程的完成

转载 作者:行者123 更新时间:2023-12-04 18:55:38 33 4
gpt4 key购买 nike

documentation of withContext 状态

Calls the specified suspending block with a given coroutine context, suspends until it completes, and returns the result.



但是,实际行为是它也在等待所有子协程,并且不一定返回 block 的结果,而是在子协程中传播任何异常。
suspend fun main() {
try {
val result = withContext(coroutineContext) {
launch {
delay(1000L)
throw Exception("launched coroutine broke")
}
println("done launching")
42
}
println ("result: $result")
} catch (e: Exception) {
println("Error: ${e.message}")
}
}

我希望上面能打印出 result: 42然后,可能会从子协程打印未捕获的异常。相反,它等待一秒钟,然后打印 Error: launched coroutine broke .

因此,实际行为与 coroutineScope 的行为相匹配。 build 者。虽然这可能是一种有用的行为,但我认为它与文档相矛盾。文档是否应该更新为类似于 coroutineScope 的内容? ?

This function returns as soon as the given block and all its children coroutines are completed.



此外,这是否意味着我们可以使用 coroutineScopewithContext(coroutineContext)可以互换,唯一的区别是样板少一点?

最佳答案

withContext创造了一个新的工作。这意味着在里面启动的所有协程都是这个工作的 child 。它仅在作业完成时返回。由于结构化并发,它只有在所有子协程也完成时才会完成。

当任何子作业失败时,父作业将被取消。这也将取消所有其他子作业。由于withContext返回结果,抛出异常。

documentationCoroutineScope在这方面有帮助:

Every coroutine builder (like launch, async, etc) and every scoping function (like coroutineScope, withContext, etc) provides its own scope with its own Job instance into the inner block of code it runs. By convention, they all wait for all the coroutines inside their block to complete before completing themselves, thus enforcing the discipline of structured concurrency.



我认为 withContext 的文档也可以改进。 Job 的文档和 CoroutineContext非常有帮助,因为它们提供了更高层次的观点。

Furthermore, does that mean that we can use coroutineScope and withContext(coroutineContext) interchangeably, the only difference being a bit less boilerplate?



是的,它们的行为方式应该相同。不过,它们适用于不同的用例。
coroutineScope旨在为多个并行协同程序提供一个范围,如果有任何失败,所有并行协同程序都将被取消。
withContext旨在用于切换给定代码块的上下文(例如调度程序)。

Here是我最近在 kotlin 论坛上提出的类似问题。该线程包含一些更多类似的案例和进一步的见解。

关于kotlin - 为什么 withContext 等待子协程的完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56904057/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com