Kotlin Coroutine 中的 delay() 是非阻塞函数吗?
Posted
技术标签:
【中文标题】Kotlin Coroutine 中的 delay() 是非阻塞函数吗?【英文标题】:Is delay() In Kotlin Coroutine a non-blocking function? 【发布时间】:2019-08-15 01:53:56 【问题描述】:示例代码中的注释说 delay() 是非阻塞的。应该暂停吗?
https://kotlinlang.org/docs/reference/coroutines/basics.html
fun main()
GlobalScope.launch // launch new coroutine in background and continue
delay(1000L) // non-blocking delay for 1 second (default time unit is ms)
println("World!") // print after delay
println("Hello,") // main thread continues while coroutine is delayed
Thread.sleep(2000L) // block main thread for 2 seconds to keep JVM alive
【问题讨论】:
这是一个正确的描述,因为它没有阻塞任何线程,它只是暂停当前的协程。 非阻塞是计算机科学中定义明确的术语。根据定义,println("World!") 将立即运行,而不是等待 1 秒。如果您的意思不同,请勿使用此术语。 我的意思肯定不一样,我没看懂你想说什么。正如我刚刚解释的那样,延迟不是阻塞调用。 @Moira:延迟是暂停和非阻塞。乔佛里已经回答了。它不仅仅是“非阻塞”。 @Moira:正如你所说,“它只是暂停当前的协程”。为什么延迟电话的评论没有这样说?相反,评论是“非阻塞的”。这不是误导吗? 【参考方案1】:delay
正在暂停且非阻塞。
TL;DR: delay
在执行当前协程中的语句之前确实具有“等待”的效果。非阻塞只是意味着在这个等待期间,当前的线程可以做其他事情。
Kotlin 文档中经常将挂起函数称为“非阻塞”,以明确它们不会阻塞当前线程,而是简单地挂起当前协程。
有时它可能会产生误导,因为“非阻塞”强调没有任何东西被阻塞这一事实,而仍然应该明确的是,挂起函数确实会挂起当前的协程(所以至少 某事 em> 有点阻塞,即使线程本身继续运行)。
它们暂停当前协程的事实使这些函数从当前协程的角度来看是同步的,因为协程需要等待这些函数完成才能执行其余代码。但是,它们实际上并没有阻塞当前线程,因为它们的实现在后台使用了异步机制。
【讨论】:
谢谢!你的回答很有道理。这里的“非阻塞”确实具有误导性。正式文件不应将这个定义明确的术语用于其他内容。协程是一个新特性。值得定义一组新的术语来解释这些特性。 @user1443721 FWIW 这个术语对于异步编程来说一点也不陌生。例如,参见C# docs。 @user1443721 这正是 Kotiln 所做的。新术语是“挂起”,而旧术语(“阻塞”)保留旧含义,仍然指线程。 @Moira:非阻塞已经被很好地定义了,甚至比 C# 还要早。检查这个问题的答案,***.com/questions/10570246/… @Marko Topolnik:“暂停”不是新术语。它已被用来描述线程生命周期。我的问题主要是关于示例中对 delay() 函数的注释。以上是关于Kotlin Coroutine 中的 delay() 是非阻塞函数吗?的主要内容,如果未能解决你的问题,请参考以下文章