Async Rust

“Async“는 블럭될(더 이상 진행할 수 없을) 때까지 각 작업을 실행한 다음 진행할 준비가 된 다른 작업으로 전환하여 여러 작업을 동시에 실행하는 동시 실행 모델입니다. 이 모델을 사용하면 제한된 수의 스레드에서 더 많은 작업을 실행할 수 있습니다. 이는, 한 작업을 유지하고 수행하는데 필요한 오버헤드가 (스레드에 비해) 매우 낮고 운영체제가 여러 I/O들에서 현재 진행 가능한 I/O들을 효과적으로 식별해 주는 프리미티브를 제공하기 때문입니다.

Rust의 비동기 작업은 “futures“를 기반으로 하며 이는 미래에 완료될 수 있는 작업을 나타냅니다. Futures는 완료되었다는 신호를 보낼 때까지 “폴링“됩니다.

Futures는 비동기 런타임에 의해 폴링되며, 비동기 런타임에는 여러 다양한 종류가 있습니다.

비교

  • 파이썬에도 asyncio라는 유사한 모델이 있습니다. 그러나 파이썬의 Future 타입은 콜백 기반이며 폴링되지 않습니다. 파이썬으로 비동기 프로그래밍을 할 때에는, Rust에서 런타임이 내부적으로 해 주는 것과 유사한, “루프“를 명시적으로 사용해야 합니다.

  • 자바스크립트의 Promise도 비슷하지만 역시 콜백 기반입니다. 자바스크립트에서는 이벤트 루프가런타임 엔진에서 구현되므로 Promise가 처리되는 세부 과정이 숨겨집니다.