ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kotlin coroutine dispatcher란?
    Java & Kotlin 2023. 6. 26. 00:28
    반응형

    1) 코루틴과 쓰레드는 달라요

    코루틴(CoRoutine)쓰레드(Thread)는 매우 비슷해 보이는데요. 코틀린 프로그래밍을 하면서 무언가 동시적인(concurrency) 작업을 처리하기 위해서 자주 사용되기 때문일 것 같습니다.

     

    쓰레드는 프로세스를 이루는 가장 작은 단위의 흐름입니다. 예를 들어 일정 간격으로 자동 저장되는 메모장 프로세스가 실행된다고 가정합니다. 타이핑을 치면서 I/O를 담당하고, 일정 간격을 확인하며 저장하는 쓰레드는 다를 것입니다. 즉 하나의 프로세스에 여러 개의 쓰레드가 동작하고 있다고 생각할 수 있습니다.

     

    코루틴은 일시 정지, 재개할 수 있는 함수입니다. 즉 쓰레드처럼 프로세스를 구성하는 일꾼이 아닌, 하나의 함수일 뿐입니다. 그리고 코루틴은 단순히 하나의 쓰레드에서만 이루어지지 않습니다. A 쓰레드에서 실행된 코루틴이 일시 정지됐다가, B 쓰레드에서 재개될 수 있습니다.


    2) 실제로 동작시켜 봅시다!

    아래의 코드는 이렇습니다.

    • 첫 번째 lauch() 코루틴 블록을 만듭니다
    • 진입 시점의 쓰레드를 출력하고 delay() 시킵니다
    • 두 번째 launch() 코루틴을 실행시킵니다
    • 첫 번째 코루틴이 재개됐을 때 동일한 쓰레드인지 확인합니다

    • 코루틴 시작된 쓰레드 worker-1
    • 연기 후 재개된 쓰레드 worker-2

     

    코루틴 시작 지점의 쓰레드와 연기 후 재개된 시점의 쓰레드가 다른데요. 특별히 멀티 쓰레드 처리를 하거나, 추가적인 쓰레드를 할당하지는 않았습니다. 당연히 하나의 함수는 stack 메모리에 올라갈것이고, 하나의 쓰레드에서 실행될것을 기대합니다.

     

    그리고 쓰레드의 이름을 출력했을 때 DefaultDispatcher를 볼 수 있습니다. Dispatcher는 무엇이고, 왜 나오게 된걸까요?


    3) 코루틴은 dispatcher에 의해 쓰레드가 정해져요.

    코루틴 생성 시 default dispatcher가 사용되는데요. Dispatcher는 어떤 쓰레드에서 코루틴이 실행될지 결정하고 전달하는 역할을 합니다.

     

    Dispatcher는 자신만의 thread pool을 직접 관리합니다. 위의 디버깅 화면에서도 볼 수 있듯이 Dispatcher.Default는 8개의 기본 쓰레드를 가지고 있습니다. core thread pool은 해당 CPU의 코어 수만큼 생성됩니다.

     

    그런데 만약 delay()를 만나면 어떻게 될까요? 해당 코루틴은 입력된 시간 동안 대기하게 되고, 해당 코루틴을 실행 중이던 쓰레드는 다른 코루틴을 실행시키게 됩니다. 즉 work stealing 알고리즘을 이용해서 각 쓰레드가 자신의 일이 끝나면, 다른 일을 가지고 와서 하게 됩니다. 그래서 코루틴은 적은 수의 쓰레드로도 많은 일을 처리할 수 있게 됩니다.

     

    work stealing 알고리즘을 참고했을 때 위의 코루틴이 시작된 쓰레드와 연기 후 재개된 쓰레드가 다른 이유를 알 수 있는데요. 특정 쓰레드를 할당받아 수행하던 코루틴은 delay()를 만나면 해당 쓰레드의 작업공간에서 나오고, queue로 들어갑니다. 그리고 다시 재개되는데, 이때 여유 있는 쓰레드가 steal 해서 수행시키기 때문에 시점에 따라 쓰레드(worker)가 다르게 됩니다.


    4) 쓰레드 숫자를 고정시켜서 사용할 수 있을까요?

    만약 제한된 리소스에서 특정 코루틴의 쓰레드를 고정시켜서 사용하고 싶을 수도 있는데요. 코루틴을 실행할 dispatcher를 custome하여 직접 생성해서 사용할 수도 있습니다.

    • 쓰레드 1개를 가진 dispatcher 생성합니다
    • 코루틴 생성 시 defualt dispatcher가 아닌, 생성된 dispatcher가 사용됩니다

     

    만약 특정 코루틴이 지나치게 많은 쓰레드를 생성하여, 전체 시스템 자원에 영향을 미칠 수도 있습니다. 이때는 특정 쓰레드 풀을 제한적으로 사용하여 자원을 효율적으로 활용할 수도 있을 것 같습니다.


    5) 참고 문서

    코루틴 공식 페이지

    Doordash 테크 블로그

    반응형

    댓글

Designed by Tistory.