async 랑 .await 가 문법의 두 반쪽이야. 같이, 순차적으로 보이는 코드를 쓰면서 각 대기 지점에서 스레드를 양보하게 해줘.
async 가 Future 를 만들어
async fn 은 호출할 때 안 돌아 — '나중에 결과를 낼 일' 을 나타내는 값 Future 를 반환해. 뭔가 Future 를 완료로 구동 하기 전엔 본문이 실행 안 돼. 이게 새내기한테 놀라움이야: async 함수 호출은 그 자체론 아무것도 안 해.
.await 가 구동하고 양보해
Future 의 .await 는 두 가지를 해: 그 Future 를 완료로 구동하고, 그리고 — 중요하게 — Future 가 준비 안 됐으면 (아직 I/O 대기) 현재 스레드를 양보 해 다른 작업이 돌게, 값이 준비되면 나중에 재개. 코드가 블로킹 코드처럼 위에서 아래로 읽히지만, 뒤에선 각 .await 가 잠재적 양보 지점이야.
async fn 은 await 하기 전엔 아무것도 안 하는 Future 를 반환해. 호출은 Future 를 짓기만 하고;
.await (또는 런타임) 가 실행해. '내 async 함수가 왜 안 돌지?' 는 거의 항상 Future 를 짓고 await 하거나 spawn 안 했다는 뜻이야.Future 는 lazy 하고 zero-cost
Rust 의 Future 는 lazy 하고 (poll 되기 전엔 아무것도 안 함) 효율적 상태 기계로 컴파일돼 — await 마다 힙 할당 없고, 언어 자체에 숨은 런타임 없어. 컴파일러가 네 async fn 을 런타임이 poll 하는 상태 기계로 바꿔. 그게 async 가 zero-cost 인 이유야: 언어에 구워진 가비지 컬렉션 이벤트 루프 비용을 안 내.