2025년 4월 16일 수요일

5-1-2: 동시성 중 async/await, tokio

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);
}

댓글 없음:

댓글 쓰기