kotlin协程是否会阻塞IO上的线程直到完成?
Does kotlin coroutines block a thread on IO until it is finished?
据我了解,执行阻塞 IO 的协程将阻塞它所在的线程 运行。该线程将被 OS 挂起,稍后重新安排。
这是否意味着如果我有一个包含 50 个线程和 50 个并发协程在每个线程上执行 IO 的线程池,它们将有效地阻塞线程池中的所有线程,直到至少其中一个线程完成 IO-操作?
或者是否有一种机制可以将导致阻塞 IO 的协程停放在某种队列中?
if I have a threadpool with 50 threads and 50 concurrent coroutines doing IO on each of the threads, they will effectively block all the threads in the threadpool until at least one of them has finished the IO-operation?
是的。没有办法解决阻塞方法阻塞调用线程的事实。协程不是改变这一点的魔杖。
协程的价值在于您可以使用非常自然的编程模型将阻塞操作从UI线程卸载到线程池。该代码看起来就像一个正常的函数调用,它以 return 值完成,但实际上协程挂起,以便其他 UI 事件处理程序可以 运行.
然而,协同程序在处理基于回调的非阻塞、异步 API 时真正发挥作用。在这种情况下,您可以在 UI 线程上获得可以描述为 "single-threaded concurrency" 的行为。并发通过交错执行事件处理程序来实现。与本机线程的主要区别在于交错不依赖于在线程不知情的情况下先发制人地挂起线程。相反,协程本身必须请求暂停。
据我了解,执行阻塞 IO 的协程将阻塞它所在的线程 运行。该线程将被 OS 挂起,稍后重新安排。
这是否意味着如果我有一个包含 50 个线程和 50 个并发协程在每个线程上执行 IO 的线程池,它们将有效地阻塞线程池中的所有线程,直到至少其中一个线程完成 IO-操作?
或者是否有一种机制可以将导致阻塞 IO 的协程停放在某种队列中?
if I have a threadpool with 50 threads and 50 concurrent coroutines doing IO on each of the threads, they will effectively block all the threads in the threadpool until at least one of them has finished the IO-operation?
是的。没有办法解决阻塞方法阻塞调用线程的事实。协程不是改变这一点的魔杖。
协程的价值在于您可以使用非常自然的编程模型将阻塞操作从UI线程卸载到线程池。该代码看起来就像一个正常的函数调用,它以 return 值完成,但实际上协程挂起,以便其他 UI 事件处理程序可以 运行.
然而,协同程序在处理基于回调的非阻塞、异步 API 时真正发挥作用。在这种情况下,您可以在 UI 线程上获得可以描述为 "single-threaded concurrency" 的行为。并发通过交错执行事件处理程序来实现。与本机线程的主要区别在于交错不依赖于在线程不知情的情况下先发制人地挂起线程。相反,协程本身必须请求暂停。