일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- kotlin spring
- minikube
- 코틀린 코루틴의 정석
- 정보처리기사 실기
- aws
- Spring
- CloudWatch
- Kubernetes
- CKA 기출문제
- kotlin querydsl
- 공부
- kotlin coroutine
- PETERICA
- Pinpoint
- Linux
- AI
- 기록으로 실력을 쌓자
- IntelliJ
- 정보처리기사실기 기출문제
- Java
- mysql 튜닝
- 오블완
- Elasticsearch
- 정보처리기사 실기 기출문제
- CKA
- AWS EKS
- kotlin
- APM
- 티스토리챌린지
- MySQL
- Today
- Total
피터의 개발이야기
[kotlin] 코틀린 코루틴의 정석- 스레드 기반 작업의 한계와 코루틴의 등장 본문
ㅁ 들어가며
ㅇ 코틀린 코루틴의 정석 책을 보고 정리한 글입니다.
ㅇ 이번 글에서는 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)
ㅁ 코루틴의 문제 해결
ㅇ 코루틴은 스레드 블로킹 문제 해결을 위해 등장했다.
ㅇ 개발자가 코루틴을 만들어 스캐줄러에 넘기면 코루틴은 자신이 사용할 수 있는 스레드풀에 해당 작업을 분산처리한다.
ㅇ 코루틴은 필요할 때 스레드 사용권한을 양보하고 일시중단하며, 다른작업이 스레드를 사용할 수 있게 한다.
ㅇ 일시 중단 후 재개된 코루틴은 재개 시점에 사용할 수 있는 스레드에 할당돼 실행된다.
ㅇ 경량스레드
ㄴ 코루틴은 스레드에 비해 생성과 전환 비용이 적은 경량 스레드라고 불린다.
ㅇ 코루틴은 스레드 블로킹 없이 비동기적으로 작업을 처리할 수 있으며, 이를 통해 고가용성을 확보하여 애플리케이션의 속도를 향상시킨다.
ㅁ 함께 보면 좋은 사이트
ㅇ https://youtu.be/Vs34wiuJMYk?si=Wz_4Zt_LO1gkh1qp
'Programming > Kotlin' 카테고리의 다른 글
[kotlin] 코틀린 코루틴의 정석- 빌더와 Job (1) | 2024.05.30 |
---|---|
[kotlin] 코틀린 코루틴의 정석- CoroutineDispatcher (0) | 2024.05.29 |
[kotlin] Kotlin Coroutine의 비동기 처리 장점, RxKotlin의 Callback 지옥 (0) | 2024.05.27 |
[kotlin] Springboot - Configuration properties (0) | 2024.05.25 |
[kotlin] Springboot - RestController 생성 및 WebMvcTest (0) | 2024.05.24 |