런타임은 한 번에 Future 하나 await 하는 것 이상을 하게 해. tokio::spawn, join, 그리고 join! 이 여러 async 태스크를 동시에 돌리는 도구야 — 스레드랑 채널의 async 대응물.
spawn: 동시 태스크
tokio::spawn 은 Future 를 받아 런타임에서 독립 태스크 로 돌리고, 결과를 .await 할 수 있는 핸들을 반환해. 스레드와 달리 태스크는 싸 — 런타임이 수천 개를 몇 스레드에 다중화해. spawn 이 진짜 동시성을 얻는 법이야: 여러 태스크가 각자 I/O 를 기다리면서 진척하는.
여럿을 한 번에 await
여러 Future 를 함께 기다리려면 tokio::join! 이 동시에 구동하고 다 끝날 때까지 기다려 — 하나씩 await 하는 것보다 훨씬 빨라, 대기가 겹치니까. tokio::select! 는 대신 먼저 끝나는 Future 를 기다려, 타임아웃이랑 racing 연산에 쓸모 있어.
join! 은 대기를 겹치고; 순차 .await 는 직렬화해. 1초짜리 I/O 호출 셋을 하나씩 await 하면 3초;
tokio::join! 은 동시에 돌려 ~1초에 끝나. 태스크가 독립적이면 join 이 동시 async 와 그냥 순차 async 의 차이야.태스크는 보통 Send 여야 해
tokio 가 태스크를 워커 스레드 간 옮길 수 있어서, spawn 된 Future 는 보통 Send 여야 해 — Concurrency 트랙의 그 trait. 그래서 Arc/Mutex 규칙이 여기도 적용돼: 태스크 간 상태를 Arc 로 공유하고, 컴파일러가 스레드에 하듯 async 공유를 race-free 로 유지해.