gpt4 book ai didi

kotlin - CoroutineScope 背后的概念是什么?

转载 作者:IT老高 更新时间:2023-10-28 13:38:33 27 4
gpt4 key购买 nike

看完CoroutineScope的介绍和javadoc我仍然有点困惑 CoroutineScope 背后的想法是什么。

文档的第一句话“定义新协程的范围”。我不清楚:为什么我的协程需要范围?

另外,为什么不推荐使用独立的协程构建器?为什么这样做更好:

fun CoroutineScope.produceSquares(): ReceiveChannel<Int> = produce {
for (x in 1..5) send(x * x)
}

而不是

fun produceSquares(): ReceiveChannel<Int> = produce { //no longer an extension function
for (x in 1..5) send(x * x)
}

最佳答案

您仍然可以通过在 GlobalScope 中生成全局“独立”协程来使用它们:

GlobalScope.launch {
println("I'm running unstructured")
}

但是,不建议这样做,因为在全局范围内创建协程基本上与我们使用旧线程所做的相同。您创建了它们,但不知何故需要跟踪引用以供以后加入/取消它们。

使用结构化并发,即在其范围内嵌套协程,您将拥有一个整体上更易于维护的系统。例如,如果您在另一个协程中生成协程,则继承外部范围。这具有多个优点。如果你取消外部协程,取消将委托(delegate)给它的内部协程。此外,您可以确定外部协程不会在其所有子协程完成工作之前完成。

documentation 中还有一个很好的例子。对于 CoroutineScope.

CoroutineScope should be implemented on entities with well-defined lifecycle that are responsible for launching children coroutines. Example of such entity on Android is Activity.

毕竟,您显示的 produceSquares 方法的第一个版本更好,因为它只有在 CoroutineScope 中调用时才可执行。这意味着您可以在任何其他协程中运行它:

launch {
produceSquares()
}

produceSquares内部创建的协程继承launch的作用域。您可以确定 launch 不会在 produceSquares 之前完成。此外,如果您取消了 launch,这也会影响 produceSquares

此外,您仍然可以像这样创建全局运行的协程:

GlobalScope.produceSquares()

但是,如上所述,在大多数情况下,这并不是最佳选择。

我还想宣传我写的一篇文章。有一些例子说明了范围的含义:https://kotlinexpertise.com/kotlin-coroutines-concurrency/

关于kotlin - CoroutineScope 背后的概念是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53412886/

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