Can*_*ato 31 kotlin kotlin-coroutines
在这个问题中:Kotlin Coroutines 选择 Dispatcher
我们可以理解Dispatcher.Default
在 CPU 进程上使用,例如图像/视频转换以及Dispatcher.IO
在写入/读取文件或 API 连接时。
但是在类Dispatcher.kt
文档中,IO
您会发现:
* This dispatcher shares threads with a [Default][Dispatchers.Default] dispatcher, so using
* `withContext(Dispatchers.IO) { ... }` does not lead to an actual switching to another thread —
* typically execution continues in the same thread.
Run Code Online (Sandbox Code Playgroud)
所以基本上它们无论如何都运行在同一个线程上。有真正的区别还是最终每个人使用都无关紧要?
谢谢!
Fra*_*esc 56
不同之处在于Dispatchers.Default
它受限于 CPU 内核的数量(最少为 2 个),因此只有 N 个(其中 N == cpu 内核)任务可以在此调度程序中并行运行。
在 IO 调度器上默认有 64 个线程,因此该调度器上最多可以运行 64 个并行任务。
这个想法是 IO 调度程序花费大量时间等待(IO 阻塞),而默认调度程序用于 CPU 密集型任务,其中很少或没有睡眠。
Mar*_*nik 27
所以基本上它们无论如何都运行在同一个线程上。有真正的区别还是最终每个人使用都无关紧要?
您在文档中的引述只是详细说明了 Kotlin 引入的优化:在Default
和之间切换上下文时IO
,您无需支付昂贵的切换到另一个线程的费用;相反,线程本身移动到另一个池。
这不会影响Default
和IO
调度程序后面的线程池的整体属性:
Default
有一个固定大小的硬编码到可用处理器的数量,因为这对 CPU 密集型任务有意义。IO
是一个具有可配置最大大小的弹性线程池。该池中的线程预计大部分时间都处于不可运行状态,等待 IO 操作完成,因此拥有比 CPU 内核更多的线程是有意义的。 归档时间: |
|
查看次数: |
9622 次 |
最近记录: |