러스트에서 비동기성은 Future를 통해 구현됩니다. 이는 미래에 결과를 얻을 작업을 나타내는 객체입니다. async fn으로 선언된 함수는 Future 트레이트를 구현하는 익명 구조체 생성기를 반환합니다. 비동기 코드를 실행하려면 런타임(예: Tokio 또는 async-std)이 필요합니다. 표준 라이브러리에는 내장된 이벤트 루프가 포함되어 있지 않습니다.
러스트의 주요 특징:
예:
use tokio::time::sleep; use std::time::Duration; async fn foo() { println!("안녕하세요"); sleep(Duration::from_secs(1)).await; println!("세계!"); } #[tokio::main] async fn main() { foo().await; }
러스트에서 비동기 함수는 기본적으로 호출 시 즉시 실행될 수 있나요? 그 이유는 무엇인가요?
답변:
아니요. async fn 호출은 결과를 반환하는 것이 아니라 Future(상태 기계) 유형의 객체를 반환합니다. 실제 실행을 위해서는 .await를 호출하거나 Future를 런타임에 전달해야 합니다. 호출 자체는 작업의 설명만 생성할 뿐, 실제로 수행하지는 않습니다.
예:
async fn answer() -> u32 { 42 } let fut = answer(); // 여기서는 실행되지 않고 future만 생성됩니다. let result = fut.await; // 여기서 실행이 시작됩니다.
이야기
.await를 호출하지 않았습니다. 이로 인해 주요 스레드가 동기적으로 실행되어 성능 저하와 응답 시간이 3배 증가했습니다.이야기
이야기
팀의 한 구성원이 Future 내에서 사용되는 유형에 대한 Send/Sync 제약을 잊었습니다. 스레드 간에 future를 공유하려 할 때 애플리케이션이 특정 구조체에 대해 Send를 구현해야 한다는 컴파일 오류가 발생하여 상태 저장 아키텍처를 재검토해야 했습니다.