Kotlin协程会在完成之前阻塞IO上的线程吗?

时间:2018-10-04 12:54:16

标签: kotlin kotlinx.coroutines

据我了解,确实阻止IO的协程将阻止其运行的线程。该线程将被操作系统挂起,以在以后重新安排。

这是否意味着,如果我有一个包含50个线程和50个并发协程在每个线程上执行IO的线程池,它们将有效地阻塞线程池中的所有线程,直到其中至少一个线程完成IO操作为止?

或者是否存在一种机制,可以将导致阻塞IO的协程停放在某种队列中?

1 个答案:

答案 0 :(得分:0)

  

如果我有一个包含50个线程和50个并发协程在每个线程上执行IO的线程池,它们将有效地阻塞线程池中的所有线程,直到其中至少一个完成IO操作为止。

是的。阻塞方法无法阻塞调用线程。协程不是改变它的魔杖。

协程的价值在于,您可以使用非常自然的编程模型将阻塞操作从UI线程卸载到线程池。该代码看起来就像一个普通的函数调用,带有一个返回值,但实际上协程会挂起,以便其他UI事件处理程序可以运行。

但是,协程在与基于回调的非阻塞异步API配合使用时确实发光。在这种情况下,您可以在UI线程上获得可描述为“单线程并发”的行为。并发通过交错事件处理程序的执行来工作。本机线程的主要区别在于,交织不依赖于在不知情的情况下抢先挂起的线程。相反,协程本身必须要求暂停。