본문 바로가기
공부/코틀린코루틴:딥다이브(마르친 모스카와)

12장 - 디스패처

by 띵커베르 2024. 2. 20.
728x90
  • 코틀린 코루틴 라이브러리가 제공하는 중요한 기능은 코루틴이 실행되어야 할 스레드를 결정할 수 있다는 것
  • 디스패처를 이용해 이러한 기능을 사용할 수 있다.

 

  • 기본 디스패처
    • 디스패처를 설정하지 않으면 기본적으로 설정되는 디스패처는 CPU 집약적인 연산을 수행하도록 설계된 DIpatchers.Default 입니다.
    • 코드가 실행되는 컴퓨터의 CPI 개수와 동일한 수(최소 두 개 이상)의 스레드 풀을 가지고 있습니다.
    • runBlocking은 주로 테스트나 메인 함수와 같은 블로킹 환경에서 코루틴 코드를 실행하기 위해 사용됩니다.
    • runBlocking을 호출하면 호출한 스레드를 블로킹합니다. 즉, runBlocking 블록 내의 모든 코루틴 작업이 완료될 때까지 현재 스레드가 대기 상태가 됩니다.
    • runBlocking은 자신만의 코루틴 디스패처를 생성하지 않습니다. 특별히 다른 디스패처를 지정하지 않으면, runBlocking 블록 내의 코루틴들은 기본적으로 호출한 스레드(즉, 'main' 스레드나 runBlocking을 호출한 다른 스레드)에서 실행됩니다.
  • 기본 디스패처를 제한하기
    • Dispatchers.Defaul 의 limitedParallelism 을 사용하면 디스패처가 같은 스레드 풀을 사용하지만 같은 시간에 특정 수 이상의 스레드를 사용하지 못하도록 제한할 수 있습니다.
  • 메인 디스패치
    • 안드로이드에서 메인 스레드는 UI와 상호작용하는 데 사용하는 유일한 스레드이다.
    • 메인스레드가 블로킹되면 전체 애플리케이션이 멈춰 버린다.
  • IO 디스패처
    • 파일을 읽고 쓰는 경우, 안드로이드의 셰어드 프레퍼런스를 사용하는 경우, 블로킹 함수를 호출하는 경우처럼 I/O 연산으로 스레드를 블로킹할 때 사용하기 위해 설계되었다.
    • Dispatchers.IO 는 64개 또는 더 많은 코어가 있다면 해당 코어의 수 로 제한이 된다.
    • Dispatchers.Default 와 Dispatchers.IO 는 같은 스레드 풀을 공유한다.
    • Dispatchers.IO 를 사용하는 가장 흔한 경우는 라이브러리에서 블로킹 함수를 호출해야 하는 경우이다. 이런경우 withContext(Dispatchers.IO) 로 래핑해 중단 함수를 만드는 것이 가장 좋다.
  • 커스텀 스레드 풀을 사용하는 IO 디스패처
    • Dispatchers.IO 에는 limitedParallelism 함수를 위해 정의된 특별한 작동 방식이 있습니다.
    • limitedParallelism 함수는 독립적인 스레드 풀을 가진 새로운 디스패처를 만듭니다.
    • 이렇게 만들어진 풀은 우리가 원하는 만큼 많은 수의 스레드 수를 설정할 수 있으므로 스데르 수가 64개로 제한되지 않습니다.
    • Dispatchers.IO.limitedParallelism(100)을 사용하여 100개의 병렬 작업을 수행할 수 있는 별도의 디스패처를 생성할 수 있다는 것을 의미합니다. 이렇게 생성된 디스패처는 원본 Dispatchers.IO와 동일한 스레드 풀을 공유할 수 있지만, 동시에 실행될 수 있는 작업의 수는 서로 독립적으로 관리됩니다.
      단, 이러한 디스패처들은 모두 같은 백엔드 스레드 풀을 공유하기 때문에, 전체적인 시스템 리소스 사용은 여전히 관리되어야 합니다. 즉, Dispatchers.IO의 병렬성 한도를 초과하는 다수의 디스패처를 생성한다 해도, 실제 사용 가능한 스레드 수는 시스템의 자원에 의해 제한됩니다.
  • 정해진 수의 스레드 풀을 가진 디스패처
    • 자신이 스레드 풀을 직접 관리하기를 원하는 니즈가 있을때 자바는 이를 지원해주는 API 제공해준다
    • close 함수로 반드시 닫아줘야한다.
  • 싱글스레드로 제한된 디스패처
    • 요즘은 주로 Dipatchers.Default.limitedParallelism(1) 식으로 주로 사용함.
728x90

댓글