具有协程异步构造的自定义线程池

dat*_*ode 3 multithreading threadpool kotlin kotlin-coroutines

我正在使用异步构造来并行执行某些任务。

ids.forEach { id -> val result = async { getResult(id) } }
Run Code Online (Sandbox Code Playgroud)

对此我有2个问题。

  1. 我相信并行执行这些任务的默认线程池将具有 max(1, CPUs -1) 个线程。这种理解正确吗?
  2. 我想改用自定义线程池。
val context = newFixedThreadPoolContext(15, "custom pool")
Run Code Online (Sandbox Code Playgroud)

如何将此池传递给异步构造。请指教。

bro*_*oot 6

默认情况下,async()从调用它的上下文继承协程调度程序。如果您创建一个单线程上下文并在其中调用,async()那么它将在相同的单线程环境中运行。

在某些情况下,调度程序可能未指定,例如,如果您使用GlobalScope.async(). 在这种情况下Dispatchers.Default使用。文档说:

默认情况下,此调度程序使用的最大线程数等于 CPU 核心数,但至少为两个。

与您自己的调度程序一起使用async()非常简单:

async(context) { getResult(id) }
Run Code Online (Sandbox Code Playgroud)