Rust Async Runtime Explained | Async RUST
- Rust의 비동기 런타임은 비동기 코드를 실행하고, 태스크를 스케줄링하며, I/O 및 타이머를 처리하여 Rust 퓨처가 실행될 수 있도록 하는 핵심 엔진입니다. ⚙️
async_std::task::block_on이나 #[tokio::main] 매크로, tokio::runtime::Runtime과 같은 도구들이 내부적으로 비동기 런타임을 설정하고 관리합니다. 💻
- 비동기 런타임은 레스토랑의 주방(모든 주문이 처리되는 환경), Executor는 헤드 셰프(주문 진행 상황 관리), Future는 주문에 비유할 수 있습니다. 🍽️
- Rust의 퓨처는 '게으르고(lazy)' 협력적(cooperative)입니다. 즉, 명시적으로 폴링(polling)되기 전까지는 아무것도 하지 않으며, 다른 태스크가 실행될 수 있도록
.await를 통해 양보해야 합니다. 😴
- Rust 퓨처는 OS 스레드나 프로세스에 직접 연결되지 않으므로, OS 런타임만으로는 퓨처를 자동으로 실행하고 관리할 수 없어 별도의 비동기 런타임이 필요합니다. 🔄
- 비동기 함수 호출 시, 사용자 코드는 실행되지 않는 퓨처를 반환하고, 런타임이 이 퓨처를 Executor에 스케줄링하며, Executor는 퓨처를 폴링하고 필요시 Waker를 등록하여 I/O 또는 타이머 이벤트 대기 후 완료되면 결과를 반환합니다. ➡️
- Executor는 Spawner가 생성한 태스크(퓨처)를 태스크 큐에서 가져와 폴링하고, 진행이 불가능할 경우 Waker에 등록하여 외부 이벤트 대기 후, 이벤트 발생 시 Waker가 태스크를 다시 큐에 넣어 Executor가 재개할 수 있도록 합니다. 🧠