Node.jsとGolangを合体させたもの
膨大なリクエストをシングルスレッド&イベントループ&非同期I/Oで効率よく処理するランタイム(ライブラリ)
tokioではOSではなくランタイムがタスクのスケジューリングを行う。タスク生成はtokio::spawnを呼び出す
use std::time::Duration; #[tokio::main] async fn main() { tokio::task::spawn(async { tokio::time::sleep(Duration::from_secs(2)).await; println!("Done"); }); std::thread::sleep(Duration::from_secs(3)); println!("wake up"); }
シングルスレッド
use std::time::Duration; #[tokio::main(flavor="current_thread")] async fn main() { tokio::task::spawn(async { tokio::time::sleep(Duration::from_secs(2)).await; println!("Done"); }); std::thread::sleep(Duration::from_secs(3)); println!("wake up"); }
use std::time::Duration; #[tokio::main(flavor="multi_thread", worker_threads = 1)] async fn main() { let cpus = num_cpus::get(); println!("logical cores: {}", cpus); tokio::task::spawn(async move { println!("task 1 started.."); tokio::time::sleep(Duration::from_secs(3)).await; println!("task 1 wake up"); }); tokio::task::spawn(async move { println!("task 2 started.."); tokio::time::sleep(Duration::from_secs(1)).await; println!("task 2 wake up"); }); tokio::time::sleep(Duration::from_secs(5)).await; println!("wake up"); }
task 1 started..
task 2 started..
task 2 wake up
task 1 wake up
wake up
use std::time::Duration; use futures::{stream::FuturesUnordered, StreamExt}; use std::thread; #[tokio::main(flavor="multi_thread", worker_threads = 1)] async fn main() { // console_subscriber::init(); let mut tasks = FuturesUnordered::new(); let h1 = tokio::spawn(async move { thread::sleep(Duration::from_secs(10)).await; println!("0 wake up"); }); tasks.push(h1); println!("0 started..."); for i in 1..100 { let h2 = tokio::spawn(async move { tokio::time::sleep(Duration::from_secs(1)).await; println!("{i} woke up!"); }); tasks.push(h2); println!("{i} ..."); } while let Some(item) = tasks.next().await { let () = item.unwrap(); } println!("Done"); }