2017-12-01 3 views
1

내가 Kotlin Coroutines 실험 및 다음 코드가 있어요 : 로마 Elizarov의 다른 코 루틴에 answer 관련 질문에 따르면멀티 스레딩 사용하여 코 틀린 코 루틴

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 

:

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() } 
} 

이 내 출력

"출시로 새로운 코 루틴이 생성되는 반면 CommonPoo l coroutines을 다중 스레드를 사용하는 ForkJoinPool.commonPool()에 전달하여이 예제에서 여러 CPU에서 실행합니다. " 자바 8 documentation에 따르면

:

분리 또는 사용자 정의 풀을 필요로하는 응용 프로그램에 대한

"는 ForkJoinPool 주어진 목표 병렬 처리 수준으로 구성 될 수있다; 기본적으로, 수와 동일 사용 가능한 프로세서. "

왜 3 개의 작업자 스레드가 사용됩니까? 비동기 작업의 수를 1000 개 이상으로 늘리는 경우에도 동일한 3 개의 작업자 스레드가 있습니다.

내 구성 : (Hyper-threading에 따라서 4 볼 코어) 듀얼 코어 CPU와 맥/하이 시에라, 코 틀린 1.2, kotlinx - 코 루틴 코어 : 0.19.3 및 JVM 1.8

답변

2

당신이 보면 CommonPool의 구현, 당신은 다음과 같은 크기 java.util.concurrent.ForkJoinPool 또는 스레드 풀에서 일하고 것을 알 수 있습니다 :

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

4 가능한 프로세서로, 이것은 당신이 3 개 작업자 스레드를 참조 왜 대답하는 3가 발생합니다. 다음과 같이

ForkJoinPool -size가 (같은 것)를 정의 할 수 있습니다 : 물론

ForkJoinPool.commonPool().parallelism 
+0

내가 그렇게보고 싶었어 ... :) 감사합니다! –