관리 메뉴

피터의 개발이야기

[kotlin] 코틀린 코루틴의 정석- 스레드 기반 작업의 한계와 코루틴의 등장 본문

Programming/Kotlin

[kotlin] 코틀린 코루틴의 정석- 스레드 기반 작업의 한계와 코루틴의 등장

기록하는 백앤드개발자 2024. 5. 28. 10:10
반응형

ㅁ 들어가며

코틀린 코루틴의 정석 책을 보고 정리한 글입니다.

ㅇ 이번 글에서는 1장 스레드 기반 작업의 한계와 코루틴의 등장을 읽거,
   코루틴이 단일 스레드, 멀티스레드의 한계인 스레드 블러킹을 해결하는 원리인 경량 스레드에 대해서 정리하였다. 

 

ㅁ 단일 스레드의 한계와 멀티스레드 

ㅇ 메인 스레드는 일반적으로 프로세스의 시작과 끝을 함께 하는 역할을 한다.

ㅇ JVM의 프로세스는 기본적으로 메인 스레드 단일 스레드로 실행된다. 

ㅇ 단일 스레드의 한계

  ㄴ 단일 스레드는 동시작업을 수행할 수 없기 때문에 하나의 작업이 오래 걸리면 다른 작업의 처리도 지연된다.

ㅇ 멀티 스레드

  ㄴ 오래 걸리는 작업은 멀티 스레드를 이용하여 백그라운드로 처리한다.

  ㄴ 실시간성으로 처리해야 할 화면 그리기나 사용자 이벤트 처리 등을 빠르게 진행 할 수 있다.

  ㄴ 여러 스레드가 동시에 작업을 처리하며, 이를 병렬처리(Parallel Processing)이라고 한다.

ㅁ 멀티 스레드 프로그래밍

class TestThread : Thread() {
  override fun run() {
    println("새로운 스레드 시작")
    Thread.sleep(2000L) // 2초 대기
    println("새로운 스레드 종료")
  }
}

fun main() {
  println("메인 스레드 시작")
  TestThread().start()
  Thread.sleep(1000L) // 1초 대기
  println("메인 스레드 종료")
}

ㅇ Thread의 run을 재정의하여 새로운 스레드를 실행할 수 있다.

ㅇ 자식 스레드와 메인 스레드가 동시에 작업을 수행하여 병렬처리가 이루어진다.

 

ㅇ 스레드 생성의 단점

 ㄴ 스레드 생성 비용이 비싸다.

 ㄴ 스레드의 생성과 관리는 개발자에게 부담이 된다. 

    - 프로그램의 복잡성이 증가하고, 오류로 인해 메모리 누수 현상이 발생될 수 있다. 

    - 스레드의 생성 및 관리의 편리성을 위해 Executor 프레임웍가 개발되었다.

 

ㅁ Executor 프레임웍이란?

  Executor 프레임웍은 개발자를 스레드관리에서 자유롭게 해주고 비지니스로직에 집중할 수 있게 하였다. 프레임웍은 스레드풀을 생성하여 기존 생성비용에 대한 오버헤드를 줄였다.

val executorService: ExecutorService = Executors.newFixedThreadPool(2)

executorService.submit {   // 작업1 제출
  println("작업1")
}

executorService.submit {  // 작업2 제출
  println("작업2")
}

executorService.submit {  // 작업3제출
  println("작업3)
}

executorService.shutdown()   // ExecutorService 종료

ㅇ 스레드 2개를 생성하는 ExecutorService에 submit으로 job을 수행할 수 있다.(Code1-6.kt)

ㅇ 스레드 풀이 2개인데 3개의 작업을 수행하면, 선행된 작업이 완료되면 작업3이 수행된다.(Code1-7.kt)

 

ㅁ Executor 프레임웍의 한계

 ㅇ 스레드 블로킹은 스레드를 점유하면서 아무것도 할 수 없는 교창상태를 말한다. 

 ㅇ Executor 프레임웍은 스레드 블로킹을 근복적으로 해결하지 못하였다.

ㅇ 스레드 블로킹은 콜백을 사용하거나 체이닝 함수를 사용하여 일부 극복할 수 있지만, 작업이 많아지면 작업 간의 종속성이 복잡해고 스레드 블로킹을 피할 수 없어 병목이 발생한다. 

  ㄴ CompletableFuture을 이용한 비동기 작업 수행코드 (Code1-10.kt)

 

ㅁ 코루틴의 문제 해결

코틀린 코루틴의 정석, p56

 

ㅇ 코루틴은 스레드 블로킹 문제 해결을 위해 등장했다.

ㅇ 개발자가 코루틴을 만들어 스캐줄러에 넘기면 코루틴은 자신이 사용할 수 있는 스레드풀에 해당 작업을 분산처리한다. 

ㅇ 코루틴은 필요할 때 스레드 사용권한을 양보하고 일시중단하며, 다른작업이 스레드를 사용할 수 있게 한다. 

ㅇ 일시 중단 후 재개된 코루틴은 재개 시점에 사용할 수 있는 스레드에 할당돼 실행된다.

경량스레드

  ㄴ 코루틴은 스레드에 비해 생성과 전환 비용이 적은 경량 스레드라고 불린다. 

ㅇ 코루틴은 스레드 블로킹 없이 비동기적으로 작업을 처리할 수 있으며, 이를 통해 고가용성을 확보하여 애플리케이션의 속도를 향상시킨다.

 

ㅁ 함께 보면 좋은 사이트

조세영 - 코틀린 코루틴의 정석 

https://youtu.be/Vs34wiuJMYk?si=Wz_4Zt_LO1gkh1qp

 

반응형
Comments