코루틴(Coroutine)은 비동기 프로그래밍과 동시성 처리를 위한 경량 실행 단위/함수
일반적으로 코루틴은 실행을 일시 중단하고(중단점 제공), 필요한 시점에 다시 시작할 수 있는 기능을 가지고 있음
코루틴의 특징
- 경량 스레드:
- 코루틴은 스레드와 유사하게 보이지만, 실제 스레드를 생성하지 않고 실행되므로 더 적은 리소스를 사용함
- 코루틴은 스레드보다 가벼운 구조로, 많은 수의 코루틴을 동시에 실행할 수 있어 메모리 사용량을 줄이고 성능을 향상시킴
- 비동기 작업 처리:
- await 또는 yield 같은 키워드를 통해 작업의 흐름을 중단하고, 나중에 재개할 수 있음
- 코루틴은 비동기적으로 실행되며, 다른 작업과 동시에 진행될 수 있어 CPU 자원을 효율적으로 사용할 수 있게 해줌
- 스케줄링 제어:
- 코루틴은 프로그래머가 명시적으로 실행 순서를 제어할 수 있음
- 언제든 중단/재개 가능:
- 작업의 중간에서 멈췄다가 나중에 다시 이어서 실행할 수 있어 효율적인 비동기 작업 처리가 가능
- 코루틴은 실행 상태를 유지할 수 있어, 중단된 지점에서 다시 시작할 수 있음
언제 코루틴을 사용하나?
- I/O 작업:
- 네트워크 요청, 파일 읽기/쓰기 등 시간이 오래 걸리는 작업에서 UI 스레드나 메인 스레드를 차단하지 않고 비동기적으로 처리.
- 동시성 프로그래밍:
- 여러 작업을 병렬로 처리할 때 스레드보다 더 효율적으로 관리 가능.
- UI 프로그래밍:
- 애니메이션, 이벤트 처리, 사용자 인터페이스 업데이트 등 비동기 작업을 자연스럽게 구현.
- 백그라운드 작업:
- CPU 집약적인 작업이나 긴 대기 시간이 필요한 작업을 수행하면서 메인 스레드를 차단하지 않음.
코루틴 자바 지원 X
자바의 virtual thread랑 비교?
코루틴은 비동기 작업을 간편하게 처리하기 위해 설계된 반면, 버추얼 스레드는 높은 동시성을 요구하는 환경에서 효율적으로 스레드를 관리하기 위한 방법
- 코루틴: 비동기 작업을 중단하고 재개할 수 있는 경량 구성 요소로, 비동기 작업 처리가 주 용도
- 버추얼 스레드: 동기적인 프로그래밍 모델을 유지하면서도 높은 동시성을 처리할 수 있는 경량 스레드로, 비동기 코드의 복잡성을 줄임
코루틴
- 핵심 아이디어: 사용자 수준의 스케줄링
- 코루틴은 명시적인 중단 지점을 통해 비동기 작업을 관리
- 단일 스레드에서도 여러 코루틴을 실행할 수 있음
- 동작 방식:
- 비동기: 코루틴은 주로 비동기 작업을 처리하는 데 사용. 코루틴은 일시 중단과 재개가 가능하여, 비동기 네트워크 호출이나 파일 I/O 작업을 쉽게 처리할 수 있음
- 런타임이 코루틴의 상태를 관리하고, 필요 시 다시 스케줄링
- 예: suspend 함수 호출 시 작업을 중단하고 다른 작업을 실행
장점:
- 명시적인 상태 관리로 복잡한 비동기 로직 처리에 강력.
- 메모리 및 리소스 효율성이 높음.
단점:
- 프로그래머가 중단 지점을 명시적으로 관리해야
- 자바에서는 안됨(Kotlin에서 주로 사용)
버추얼 스레드
- 핵심 아이디어: JVM이 직접 관리
- 전통적인 스레드는 OS 커널에서 관리되지만, 버추얼 스레드는 JVM 내부에서 관리되어 더 적은 자원을 소비
- 각 작업은 자체적인 스레드처럼 동작하므로 프로그래머가 명시적으로 중단점을 관리할 필요가 없음
- 버추얼 스레드는 동기적으로 작업을 수행. 전통적인 스레드와 유사한 방식으로 작동하지만, 더 가볍고 효율적
- 동작 방식:
- 동기적 코드 작성: 버추얼 스레드는 비동기 작업을 동기적인 코드 스타일로 작성할 수 있게 한다. 이는 비동기 코드의 복잡성을 줄이고, 동기적인 프로그래밍 모델을 유지.
- 차단 호출(예: I/O 작업) 발생 시 자동으로 OS 스레드에서 분리
- 기존 스레드 풀보다 더 많은 수의 동시 작업 가능
장점:
- 기존 스레드 API와 호환성 높음 (학습 곡선 낮음).
- synchronized 블록, wait/notify 메서드 등을 그대로 사용 가능
- 차단 호출도 자동으로 처리하므로 더 간단한 코드 작성 가능.
단점:
- 자바 19 이상의 JVM에서만 사용 가능.
- 특정 시나리오에서는 기존 스레드 풀만큼의 효율성 제공 어려움.
전통적인 스레드와의 비교
- 전통적인 스레드:
- OS에서 관리되며, 각각의 스레드는 상당한 메모리와 자원을 차지
- 많은 수의 스레드를 생성하면 성능 문제가 발생할 수
- 버추얼 스레드:
- JVM에서 관리되며, 매우 가벼움
- 대량의 동시 작업을 처리할 때 효율적
'개발 > java' 카테고리의 다른 글
[병렬처리] Folkjoinpool & executorService (0) | 2024.11.26 |
---|---|
[동기화] 뮤텍스/세마포어 (0) | 2024.11.24 |
DB로 분산락 구현 (2) | 2024.11.21 |
[test] org.mockito.exceptions.misusing.PotentialStubbingProblem (1) | 2024.11.15 |
자바와 스프링에서 thread pool (0) | 2024.11.11 |