Многопоточность с использованием Kotlin Corouts

Я экспериментирую с Kotlin Coroutines и имею следующий код:

fun main(args: Array<String>) = runBlocking { val cores = Runtime.getRuntime().availableProcessors() println("number of cores: $cores") val jobs = List(10) { async(CommonPool) { delay(100) println("async #$it on thread ${Thread.currentThread().name}") } } jobs.forEach { it.join() } } 

Это мой вывод:

 number of cores: 4 async number:0 on thread ForkJoinPool.commonPool-worker-2 async number:2 on thread ForkJoinPool.commonPool-worker-3 async number:3 on thread ForkJoinPool.commonPool-worker-3 async number:4 on thread ForkJoinPool.commonPool-worker-3 async number:5 on thread ForkJoinPool.commonPool-worker-3 async number:1 on thread ForkJoinPool.commonPool-worker-1 async number:7 on thread ForkJoinPool.commonPool-worker-3 async number:6 on thread ForkJoinPool.commonPool-worker-2 async number:9 on thread ForkJoinPool.commonPool-worker-3 async number:8 on thread ForkJoinPool.commonPool-worker-1 

Согласно ответу Романа Елизарова на другой сопроводительный вопрос:

«Запуск просто создает новую сопрограмму, в то время как CommonPool отправляет сопрограммы в ForkJoinPool.commonPool (), который использует несколько потоков и, таким образом, выполняет на нескольких процессорах в этом примере».

Согласно документации Java 8:

«Для приложений, для которых требуются отдельные или настраиваемые пулы, ForkJoinPool может быть сконструирован с заданным уровнем параллелизма, по умолчанию равным количеству доступных процессоров».

Почему используется только 3 рабочих потока? Есть те же 3 рабочих потока, даже когда я увеличиваю количество асинхронных задач до 1000+.

Моя конфигурация: Mac / High Sierra с двухъядерным процессором (с Hyper-threading , таким образом, 4 видимых ядра), Kotlin 1.2, kotlinx-coroutines-core: 0.19.3 и JVM 1.8

Если вы посмотрите на реализацию CommonPool , вы заметите, что он работает с java.util.concurrent.ForkJoinPool или пулом потоков со следующим размером:

 (Runtime.getRuntime().availableProcessors() - 1).coerceAtLeast(1) 

С 4 доступными процессорами это приведет к тому, что 3 ответят, почему вы видите 3 рабочих потока.

Размер ForkJoinPool можно определить следующим образом (будет одинаковым):

 ForkJoinPool.commonPool().parallelism 
Intereting Posts