通过协程的 cancel 函数和 Job 的 cancel 函数设置 Kotlin 协程超时<#
2023-10-11 22:09:20
<#title>通过协程的 cancel 函数和 Job 的 cancel 函数设置 Kotlin 协程超时<#/title>
编程人员常常需要在应用运行时对协程实施更精细的管控。设想这样一类常见情景:用户打开一个页面后,该页面便会调出一个协程,然而,用户已于协程运行完前一刻便已翻页。此时,倘若程序继续运行该协程实则不彰,故宜尽早将其取缔。launch 函数的返回值——Job 对象——可以作为取缔正在运行中的协程时之凭借。只要函数 main 调用了 job.cancel,我们便得见拒绝其于进程中存续之请愿。
诚然,此举并非程序与协程之间协议中的 sole 选项。借力于协程的 cancel 函数和 Job 的 cancel 函数,函数的创建者得以向其赋以存在期限,超时一过,程序则会自动将其终止。
何以能为?函数的创建者倘若谋求协程之续命,则须手持延时主动呼唤协程的 cancel 函数,如此,倘若协程未被延时、而运行时间又达上限,则协程必然会受到自动取缔之遭遇。又假若函数的创建者稍予思忖,则可意识到超时期限乃属必备利器,如此,程序则可基于协程的优先级、以及其所需的运行时间等因数,分配任务,灵活取舍矣。
倘函数的创建者欲设定明确的超时期限,则可选用以下两种方式之一:
-
可于函数的上下文块中明确调取协程的 cancel 函数,实现最自定义之超时取缔。此举利于函数的创建者更改取缔逻辑,方便其于函数构建进程中或运行期任意时刻均可截获异例。
-
于外部设定超时,而具体操作方式,端赖协程函数块,或是其所属的 Job 本身。如此,函数的创建者能够撰写通盘语境上的一致代码,进而构建更为一贯清晰之 API。
诚然,协程取缔 API 之设计宗旨系为向创建协程之函数提供一致的、易于理解的 API,借以实现取缔操作,彼时,函数的创建者正于尝试获取协程函数块或 job 时,堪为举目无措。彼处境堪比处于迷宫中者,正于寻找可向其显示出口的指引。现有一份概要列表,以供函数的创建者择需取用:
-
协程的 cancel 函数:倘函数的创建者确信仅需于特定协程函数块中更改超时设定,则应选用此函数。
-
Job.cancel(原因参数)函数:此乃取缔整个 Job 的唯一 API 函数,而倘函数的创建者欲更改 job 中的某一个或多个协程函数块之超时设定,则应选用此函数。
-
Job.cancelChildren():取缔所有孩子协程函数块,此时,函数的创建者若欲中止任务关联的协程函数块,则应选用此函数。
-
Job.cancelAndJoin():取缔 job 的所有协程函数块,而倘函数的创建者欲获悉 Job 以及所有关联的协程函数块已尽皆取缔的信息,则应选用此函数。
设定协程 timeout 的效果显而易见——既能最大程度保障主程序正常执行,又切实保护了程序的主进程。具体取用哪种方式,端赖项目具体情况和程序的具体设计目标而定。