withTimeoutOrNull在1-10ms时间差下结果不一致的原因
Kotlin协程withTimeoutOrNull执行结果不一致的原因分析
先看你提供的代码:
fun main(){ runBlocking{ withTimeoutOrNull(205){ delay(200) println("Within Timeout") } delay(300) println("Outside") } }
出现这种时有时无的输出,核心原因是协程调度和系统线程的微小时间波动,具体拆解:
withTimeoutOrNull(205)给内部任务设定了205毫秒的超时窗口,但delay(200)的实际等待时间并非绝对精确——协程调度依赖系统线程,线程本身可能存在调度延迟,导致delay(200)的实际耗时会比设定值多几毫秒。- 当
delay(200)的实际耗时加上协程内部的调度开销刚好超过205毫秒时,withTimeoutOrNull会判定任务超时,直接取消内部协程,自然不会执行println("Within Timeout")。 - 当上述总耗时略小于205毫秒时,任务能在超时阈值前完成,就会输出第一条打印语句。
1-10毫秒的时间差完全是多线程/协程环境下的正常现象,尤其是系统后台有其他进程运行时,调度延迟的波动会更明显。
如果想让结果稳定输出两条语句,可以把withTimeoutOrNull的超时时间调高到210毫秒以上,或者把delay(200)的时长缩短,留出足够的缓冲空间覆盖调度波动。
内容的提问来源于stack exchange,提问作者Ken Kiarie
相关产品推荐
相关产品推荐

