tokio::sync::Semaphore
GPT-4.icon
サンプルコード(Rust 非同期セマフォ)
以下の例では、最大 2 つのタスクが同時に実行されるようにセマフォを使用します。
code:rust
use std::sync::Arc;
use tokio::sync::Semaphore;
use tokio::task;
use tokio::time::{sleep, Duration};
#tokio::main
async fn main() {
let semaphore = Arc::new(Semaphore::new(2)); // 最大2つのタスクが同時実行可能
let mut handles = vec![];
for i in 0..5 {
let sem = Arc::clone(&semaphore);
let handle = task::spawn(async move {
let _permit = sem.acquire().await.unwrap(); // セマフォを取得(リソースが空くまで待機)
println!("タスク {}: 実行開始", i);
sleep(Duration::from_secs(2)).await; // 何かの処理
println!("タスク {}: 実行終了", i);
});
handles.push(handle);
}
for handle in handles {
handle.await.unwrap();
}
}
Semaphore::new(2) → 最大 2 つのタスクが同時に実行可能
.acquire().await.unwrap() → セマフォを取得し、リソースが空くまで待機
これがP操作 (wait)に相当する
_permit はスコープを抜けると自動的にセマフォを解放
明示的なV操作 (signal)が必要ない
手動でやる方法もあるらしい