如何理解协程取消是合作的

Dav*_*ung 4 kotlin kotlin-coroutines

在 Kotlin 中,协程取消是合作的。我该如何理解?

链接到 Kotlin 文档

Mar*_*nik 5

如果您有 Java 背景,您可能熟悉线程中断机制。任何线程都可以调用thread.interrupt(),并且接收线程会以布尔isInterrupted标志变为真的形式获得一个信号。接收线程可以随时检查标志currentThread.isInterrupted()- 或者它可以完全忽略它。这就是为什么说这种机制是合作的。

Kotlin 的协程取消机制是一个精确的复制品:你有一个coroutineContext.isActive你(或你调用的函数)可以检查的标志。

在这两种情况下,一些众所周知的函数,例如Thread.sleep()在 Java 和delay()Kotlin 中,检查此标志并分别抛出InterruptedExceptionCancellationException。这些方法/功能被称为“可中断”/“可取消”。


Dir*_*lte 3

我不确定我是否理解你的问题,但这也许有帮助:

协程通常在启动它们的同一线程中执行。您可以使用不同的调度程序,但它们被设计为在从同一线程启动时工作。没有额外的安排发生。您可以将其与操作系统中的调度机制进行比较。协程的行为类似于协作调度。您会在许多框架和语言中找到类似的概念来处理异步操作。例如,红宝石具有类似行为的纤维。

基本上,这意味着如果协程在繁忙的循环中占用您的 CPU,您将无法取消它(除非您终止整个进程)。相反,您的协程必须定期检查取消情况,并添加等待/延迟/收益,以便其他协程可以工作。

这也定义了协程何时最有帮助:当在单线程上下文中运行时,使用协程进行仅本地计算没有帮助。我主要使用它们来处理异步调用,例如与数据库或 Web 服务器的交互。

本文还对协程如何工作进行了一些解释 - 也许它可以帮助您解决任何其他问题: https: //antonioleiva.com/coroutines/