在Kotlin协程中取消是合作的,如何理解? link to Kotlin documentation
答案 0 :(得分:1)
我不确定100%是否理解您的问题,但这也许会有所帮助:
协程通常在启动它们的同一线程中执行。您可以使用不同的调度程序,但是它们被设计为在从同一线程启动时起作用。无需进行任何额外的安排。 您可以将其与操作系统中的调度机制进行比较。协程的行为类似于协同调度。您可以在许多框架和语言中找到类似的概念来处理异步操作。例如,红宝石具有类似的纤维。
基本上,这意味着如果协程在繁忙的循环中占用CPU,则无法取消它(除非杀死整个过程)。相反,您的协程必须定期检查取消情况,并添加等待/延迟/收益,以便其他协程可以正常工作。
这也定义了协程何时最有用:在单线程上下文中运行时,使用协例程进行仅本地计算无济于事。我主要将它们用于处理异步调用,例如与数据库或Web服务器的交互。
本文还对协程的工作方式进行了一些解释-也许它可以帮助您解决任何其他问题:https://antonioleiva.com/coroutines/
答案 1 :(得分:0)
如果您具有Java背景,则可能熟悉线程中断机制。任何线程都可以调用thread.interrupt()
,接收线程将以boolean isInterrupted
标志的形式获得信号。接收线程可以随时使用currentThread.isInterrupted()
检查该标志,也可以完全忽略它。这就是为什么这种机制是合作的。
Kotlin的协程取消机制是它的精确复制:您有一个coroutineContext.isActive
标志,您(或您调用的函数)可以检查该标志。
在两种情况下,例如Java中的Thread.sleep()
和Kotlin中的delay()
,都需要检查此标志并分别抛出InterruptedException
和CancellationException
。这些方法/功能被称为“可中断” /“可取消”。