Threads Beat Async/Await
[요즘 IT] 비동기/대기보다 스레드가 유리한 이유
이 글은 async/await
를 활용한 비동기 프로그래밍의 한계를 논하며, 스레드 기반 접근이 더 유리한 경우를 강조한다. async/await
의 추상화가 역압(backpressure) 처리와 시스템 설계에서 복잡성을 증가시킨다는 점을 지적한다. Bob Nystrom, Ron Pressler, Nathaniel Smith 등의 논의를 바탕으로 구조적 동시성의 중요성을 강조하고, 암묵적 가정이 프로그램 흐름을 방해할 수 있음을 사례로 설명한다. 스레드는
더 직관적이고 신뢰성 있는 대안을 제공할 수 있음을 주장한다.
첫 번째로, 비동기 프로그래밍은 단순해 보이지만, 복잡한 시스템에서는 역압(backpressure) 처리와 같은 문제가 발생하며, 이는 관리하기 어렵다.
두 번째로, 구조적 동시성(structured concurrency)의 중요성을 고려했을 때, 프로그램의 흐름이 암묵적인 가정들로 인해 깨질 수 있다.
세 번째로, 스레드 기반 접근이 비동기보다 더 직관적이며, 개발자가 설계한 논리를 보존하기 쉽다.
명령형 프로그래밍
함수형 프로그래밍
비동기 프로그래밍은 함수형의 특성을 일부 포함하며, 명령형 흐름과는 설계 철학이 다르다. async/await
는 명령형처럼 보이지만 상태와 흐름 관리가 암묵적으로 작동해 복잡성을 유발한다.
백프레셔(Backpressure)는 프로듀서-컨슈머 패턴에서 프로듀서가 데이터를 너무 빨리 생성할 때, 컨슈머가 이를 처리하지 못해 생기는 문제를 말한다. 이는 데이터 처리의 병목현상을 유발하고, 시스템 성능 저하나 메모리 부족으로 이어질 수 있다.
주로 비동기 프로그래밍이나 스트리밍 시스템에서 발생하며, 이를 해결하기 위해 컨슈머가 처리 속도를 조절하거나 데이터를 일시적으로 저장하는 메커니즘이 필요하다. 예를 들어, async/await
와 같은 비동기 환경에서는 백프레셔 처리 메커니즘이 없으면 시스템 안정성을 저해할 수 있다.
async/await
vs GCDasync/await
try
, catch
와 자연스럽게 연동.