C.W.K.
Stream
Lesson 02 of 05 · published

async, await & Future

~11 min · async, await, future

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

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 인 이유야: 언어에 구워진 가비지 컬렉션 이벤트 루프 비용을 안 내.

Code

async fn 은 조합되고; await 가 구동한다·rust
// async fn 은 Future 를 반환; .await 가 구동하고 대기 중 양보
async fn step_one() -> i32 { 1 }
async fn step_two(x: i32) -> i32 { x + 1 }

async fn pipeline() -> i32 {
    let a = step_one().await;  // step_one 구동, 1 얻음
    let b = step_two(a).await; // step_two 구동, 2 얻음
    b
}

// pipeline() 은 Future 를 반환. 런타임이 await 할 때만 돌아 —
// 다음 레슨이 그 런타임 (tokio) 을 제공해.
fn main() {
    let _future = pipeline(); // 지어짐, 아직 안 돎
    println!("future created, not yet executed");
}

External links

Exercise

두 번째가 첫 번째의 결과를 받는 async fn 둘을 써. 세 번째 async fn 에서 .await 로 조합해. 그다음 그 세 번째를 main 에서 await 없이 불러 (아직 평범한 main 에선 await 못 함) 'unused Future' 경고를 봐. 경고가 laziness 에 대해 뭘 말해줘?
Hint
경고는 Future 가 구동되기 전엔 아무것도 안 해서 떠. 일을 지었는데 await 안 했어. 다음 레슨이 #[tokio::main] 을 더해 최상위에서 실제로 .await 할 수 있게 해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.