Kotlin 挂起功能是否在单独的线程上运行?

And*_*d14 3 coroutine kotlin kotlinx.coroutines

挂起功能在单独的线程上运行?如果不是,那么性能优势是什么?

suspend fun requestToken():Token {..}  // takes 2 sec to complete
suspend fun createPost (token:Token){..} // takes 3 sec to complete

 suspend fun postItem() {
    val token = requestToken()
    val post =createPost(token)
    processPost(post)
  }
Run Code Online (Sandbox Code Playgroud)

因此,当我们到达processPost(post)并且如果挂起函数没有在单独的线程上运行,那么我们必须等待requestToken()createPost(token)方法完成(即 2+3=5 秒)。根据作者的说法,暂停是异步的,但是如果我们没有产生任何新线程,那么我们如何实现异步行为?

Mar*_*nik 5

暂停是异步的

suspend funs 与其调用者同步执行。你真正想说的是“非阻塞”,这是一个完全不同的故事。

但是如果我们没有产生任何新线程,那么我们如何实现异步行为?

您默认所有 I/O 都必须在某个级别阻塞。这是错误的。非阻塞 I/O 通过将数据推送到发送缓冲区并在接收缓冲区中有数据时接收通知来工作。一suspend fun钩到这个机制通过将数据推到发送缓冲区,然后安装一个回调将恢复它时,响应数据是在准备好后悬挂本身接收缓冲区。