我正在尝试理解 Kotlin 协程的工作原理以及为什么它们被认为比线程更高效。
到目前为止,我的理解是:
- 当一个
suspend
函数暂停时,在底层它自愿地将控制权交还给调用者,调用者也会同样做,直到我们达到管理所有内容的某种“根”调用,例如协程调度器。 - 调度器检查哪些已暂停的函数准备好继续执行,并告诉它们继续。
- 基本上它类似于一个带有线程池的队列。
这个大致正确吗?
我关心的是:
如果在一个挂起函数中调用了阻塞 I/O 的经典 Java API,简单地将其包装在协程中并不能自动使代码更高效,因为它不会与调度器合作,对于 CPU 密集型任务也是如此。
也就是说,它并不像 Node 事件循环那样,默认情况下所有 I/O 都是异步的,并且被转移到类似于 epoll 的机制,而只是底层的一个大线程池吗?