2025-06-10
Rustで書いて学ぶ非同期のしくみ
Rust
Tokio
感想
同期処理・非同期処理のメリデメ、並列・並行処理の違いなどの説明から手を動かしてRustコードを書いていく流れ。
まず同期処理で書いてから、Tokioを導入して非同期処理に書き直していく形で学ぶことができた。
非同期関数をまとめてawaitするのにjoin3
を使用したが、join3
の他にjoin4
, join5
があるらしい。
join_all
は同じFuture型の配列を引数にとるが、違いとしてjoin3~5
は引数に異なるFuture型を取ることができる。
Zed
Rust製エディタのZedを使っていた。
rust-analyzerがデフォルトで搭載されていて、Vimモードがある。良さそう。
実際に書いたコードと実行結果
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
参考