2025-06-10

Rustで書いて学ぶ非同期のしくみ

Rust
Tokio

https://wake-career.connpass.com/event/356566/

感想

同期処理・非同期処理のメリデメ、並列・並行処理の違いなどの説明から手を動かしてRustコードを書いていく流れ。
まず同期処理で書いてから、Tokioを導入して非同期処理に書き直していく形で学ぶことができた。

非同期関数をまとめてawaitするのにjoin3を使用したが、join3の他にjoin4, join5があるらしい。
join_allは同じFuture型の配列を引数にとるが、違いとしてjoin3~5は引数に異なるFuture型を取ることができる。

Zed

Rust製エディタのZedを使っていた。
rust-analyzerがデフォルトで搭載されていて、Vimモードがある。良さそう。

https://zed.dev/

実際に書いたコードと実行結果

src/main.rs
use std::time::Duration;
use std::time::Instant;
use futures::future;
use tokio::time::sleep;

#[tokio::main]
async fn main() {
    let now = Instant::now();

    let future_1 = one_sec_nya();
    let future_2 = zero_five_sec_nya();
    let future_3 = zero_three_sec_nya();

    future::join3(
        future_1,
        future_2,
        future_3
    ).await;

    println!("{:?}", now.elapsed())
}

async fn one_sec_nya() {
    println!("1");
    sleep(
        Duration::from_secs_f64(1.0)
    ).await;
    println!("にゃー");
}

async fn zero_five_sec_nya() {
    println!("0.5");
    sleep(
        Duration::from_secs_f64(0.5)
    ).await;
    println!("にゃにゃー");
}

async fn zero_three_sec_nya() {
    println!("0.3");
    sleep(
        Duration::from_secs_f64(0.3)
    ).await;
    println!("にゃにゃにゃー");
}

実行結果。同期処理の場合は1.8sくらいかかってた。

cargo run
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.05s
     Running `target/debug/learn_async_rust`
1
0.5
0.3
にゃにゃにゃー
にゃにゃー
にゃー
1.005573291s

参考

https://docs.rs/tokio/latest/tokio/attr.main.html

https://docs.rs/futures/latest/futures/index.html

https://docs.rs/futures/latest/futures/future/fn.join3.html