Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 如何理解协同程序取消是合作的_Kotlin_Kotlin Coroutines - Fatal编程技术网

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

Kotlin 如何理解协同程序取消是合作的,kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,在kotlin中,取消协同程序是合作的,如何理解它 我不能100%确定我是否理解你的问题,但这可能会有帮助: 协程通常在启动它们的同一线程中执行。您可以使用不同的分派器,但它们被设计为在从同一线程启动时工作。没有额外的日程安排。 您可以将其与操作系统中的调度机制进行比较。协同程序的行为类似于协作调度。您可以在许多框架和语言中找到类似的概念来处理异步操作。例如,Ruby具有行为类似的纤维 基本上这意味着,如果一个协程在一个繁忙的循环中占用了您的CPU,您就不能取消它(除非您终止整个进程)。相反,您

在kotlin中,取消协同程序是合作的,如何理解它

我不能100%确定我是否理解你的问题,但这可能会有帮助:

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

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

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


本文还对协同程序的工作原理进行了一些解释,也许它可以帮助您解决其他问题:

如果您有Java背景,您可能熟悉线程中断机制。任何线程都可以调用
thread.interrupt()
,接收线程将得到一个
boolean isInterrupted
标志形式的信号变为true。接收线程可以随时使用
currentThread.isInterrupted()
-检查该标志,也可以完全忽略该标志。这就是为什么说这个机制是合作的

Kotlin的协程取消机制与此完全相同:您有一个
coroutineContext.isActive
标志,您(或您调用的函数)可以检查它


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

您不清楚什么?“取消协同程序是合作的。协同程序代码必须配合才能取消。kotlinx.coroutines中的所有挂起函数都是可取消的。他们检查协同路由的取消,并在取消时抛出CancellationException。然而,如果协同路由在计算中工作,并且没有检查取消,那么它就不能被取消,“这里很好地描述了协同取消: