async/await : 비동기 프로그래밍을 할 수 있는 기법 제공
async/await 를 사용하려면 Cargo.toml 파일에 추가
[dependencies]
futures = "0.3"
// await 를 사용해 다른 async 함수 호출 예제
use futures::executor::block_on;
//비동기 함수 정의
async fn calc_sum(start: i32, end: i32) -> i32 {
let mut sum = 0;
for i in start..=end {
sum += i;
}
sum
}
//비동기 함수 정의
async fn calc() -> i32 {
let sum1_50 = calc_sum(1, 50).await; //await 키워드롤 결과 얻기
let sum51_100 = calc_sum(51, 100).await; //await 키워드롤 결과 얻기
let ret = sum1_50 + sum51_100;
ret
}
fn main() {
let future = calc();
// block_on() 실행 calc가 종료될 때까지 메인 스레드는 멈춘다.
let sum = block_on(future);
println!("1부터 100까지의 합: {}", sum);
}
tokio : 비동기 작업을 실행할 수 있도록 도와주는 런타임 라이브러리
Cargo.toml 에 의존성 추가
[dependencies]
tokio = { version = "1.25.0", features = ["full"] }
use std::time::Duration;
use tokio::time;
// async 로 비동기 함수로 지정
async fn sleep_10sec() {
for i in 1..10 {
println!(".");
// 1초간 10회 대기
time::sleep(Duration::from_millis(1000)).await;
}
}
// async 로 비동기 함수로 지정
async fn calc_sum(start: i32, end: i32) -> i32 {
let mut sum = 0;
for i in start..=end {
println!("{} ", i);
sum += i;
}
sum
}
async fn calc() -> i32 {
let f1 = sleep_10sec();
let f2 = calc_sum(1, 10);
// sleep_10sec() 와 calc_sum()가 동시에 수행된다.
//tokio::join!() 를 사용해 비동기 함수를 대기한다.
let (_, sum) = tokio::join!(f1, f2);
sum
}
//tokio를 사용하는 비동기 메인 함수
#[tokio::main]
async fn main() {
let sum = calc().await;
println!("sum={}", sum);
}
댓글 없음:
댓글 쓰기