기존의 비동기 방식 및 등장 배경
기존의 코드는 탈출 클로저를 사용해서 비동기를 처리했다.
조금 극단적이긴하지만 보통 다음과 같은 상횡이다.
여기에는 크게 4가지 문제점이 있다.
1. 중첩된 콜백
첫번째 문제점은 중첩된 콜백형태가 코드 가독성이 top -down approch에 위배된다.
코드는 보통 위에서 아래로 읽게 되는데 콜백이 중첩되면 아래에서 위로 올라가는 구조가 발생된다.
2. 에러 핸들링
에러가 발생할 때 탈출 메서드에 에러 관련 처리를 해줘야하는데 그 과정이 매우 번거롭다.
async , await을 이용해서 위 코드를 리팩할 수 있다.
코드 가독성과 에러 헨들링이 비약적으로 상승되는 효과를 볼 수 있다.
3. thread explosion
기존 GCD에서 Concurrent Queue를 사용했을 때, 100개의 Task를 진행한다면 100개의 Thread가 생성된다.
이 경우 CPU가 가진 스레드의 수보다 많은 스레드가 생성되기 때문에 Thread Explosion이 발생한다.
여기서 메모리 오버헤드, 스케줄링 오버헤드의 문제가 생긴다.
- 메모리 오버헤드
- block된 스레드는 메모리와 리소스를 보유하고 있다.
- 일부는 다른 스레드에 필요한 lock을 가지고 있을 수도 있기 때문에, 최악의 경우에는 데드락이 발생할 수도 있다.
- 스케줄링 오버헤드
- CPU는 이전 스레드에서 새로운 스레드로 전환할 때 context switch를 수행한다.
- 스레드의 갯수가 많아질수록 context switch가 많아지므로 CPU의 효율성이 낮아진다.
나중에 배울 actor 개념을 이용하면 thread를 재활용해서 thread 갯수를 최대 core 개수만큼 생성을 제한하는 효과를 볼 수 있다.
'iOS > Swift Concurrency' 카테고리의 다른 글
Task Cancellation (0) | 2024.10.27 |
---|---|
구조적 동시성 (1) (0) | 2024.10.26 |
Continuation (0) | 2024.10.25 |
async await (0) | 2024.10.24 |
Task (0) | 2024.10.23 |