"Asyncronous Programming in Rust"라는 문서에서 찾은 설명이 유익해 보여서 가져왔다.

Asynchronous programming(비동기 프로그래밍)이란?

Asynchronous programming (비동기 프로그래밍)는 동시성 프로그래밍 (Concurrent programming) 모델 중 하나이며, 점차 많은 프로그래밍 언어에 차용되고 있다.

async를 통해 대용량 작업들을 적은 OS 스레드로 실행할 수 있게 해준다.

또한, async/await 문법만 잘 사용하면 기존 코드를 크게 바꾸지 않더라도 동시성을 잘 구현할 수 있다.

async와 다른 동시성 모델과의 비교

일반적으로 쓰이는 동기적 프로그래밍과 달리 동시성 프로그래밍은 여러 구현 기법과 모델이 존재한다.

동시성 모델들의 차이점을 이해하고, 각 프로그래밍 언어에서 지원하는 모델이 어떤 것인지 파악하고, 가장 효율적인 모델을 차용하는 것은 중요하다.

OS 스레드 (OS threads)

OS에서 제공하는 스레드에서 작업을 처리하는 방식이다. 스레드 방식을 차용하게 되면 기존 코드 구조를 수정하지 않아도 된다. 하지만, 스레드 간 동기화 작업이 프로그래머에게는 어려울 수 있고, 성능 오버헤드도 큰 편이다. 스레드 풀을 사용하면 오버헤드를 줄일 수 있지만, 대용량 IO 관련 작업을 처리할 때는 여전히 부족한 점이 있다.

이벤트 주도 프로그래밍 (Event-driven programming)

"콜백" 개념을 사용하여 매우 높은 성능을 발휘하는 프로그램을 구현할 수 있지만, 코드 구조가 선형적이지 않게 되고 더 지저분해질 수 있다. 또한, 코드 내 데이터의 흐름 파악과 에러 전파 구현이 작업하기에 조금 힘들 수 있다.

코루틴 (Coroutines)

스레드와 마찬가지로 코드 구조를 수정할 필요가 없으며, Async와 마찬가지로 많은 작업을 처리할 수 있다. 다만, 많은 최적화가 요구되는 시스템 프로그램 등에서 필요로 하는 저수준의 동작들이 추상화되어 버리기 때문에 고민할 필요가 있다.

액터 모델 (The actor model)

액터 모델에서는 동시 처리가 필요한 계산 작업들을 '액터(actor)'라는 부분으로 나누어, 서로 '메세지(message)' 전송을 통해 통신하여 작업을 처리하는 시스템을 구현하게 된다. 액터 모델은 효율적인 시스템을 구현하기에 좋을 수 있지만, 제어 흐름과 재시도 로직에 관련된 여러 이슈들이 존재한다.

차이점 요약

async 모델을 사용하면 고성능이며 저사양에서도 작동 가능한 프로그램을 만들 수 있으며, OS 스레드/코루틴의 장점이었던 깔끔한 코드 구조를 유지할 수 있다.

출처

https://rust-lang.github.io/async-book/01_getting_started/02_why_async.html (MIT License)

추가

본문 안에 틀리거나 다르게 볼 수 있는 정보가 있으면 댓글에 알려주세요. 내용에 반영할 수 있도록 하겠습니다. 감사합니다.

0개의 댓글