I have many tasks to be executed in parallel, but I want to execute only a few tasks at a time. For example, I have 10 tasks and I want to execute only 2 tasks simultaneously.
Given this code using tokio.rs:
let mut runtime = Builder::new() .threaded_scheduler() .core_threads(2) .enable_all() .build() .unwrap(); runtime.block_on(async { let mut threads = Vec::new(); for i in 0..10 { threads.push(tokio::spawn(async move { println!("Started thread {}", i); thread::sleep(Duration::from_millis(5000)); })); } for i in threads { i.await.unwrap(); } }) Which prints this:
Started thread 0 Started thread 1 --wait 5 seconds-- Started thread 2 Started thread 3 --wait 5 seconds-- ... This is my desired behavior, but my function is async, so I need to .await it. When I .await it, it spins all tasks at once, even though I limited core_threads to 2.
Example code with .await using tokio.rs:
fn main() { let mut runtime = Builder::new() .threaded_scheduler() .core_threads(2) .enable_all() .build() .unwrap(); runtime.block_on(async { let mut threads = Vec::new(); for i in 0..10 { threads.push(tokio::spawn(async move { println!("Started thread {}", i); delay_for(Duration::from_millis(5000)).await; })); } for i in threads { i.await.unwrap(); } }); } but the output is now something like this:
Started thread 0 Started thread 1 Started thread 2 Started thread 3 .... --wait 5 seconds-- How can I achieve the desired behavior? Is there any Rust construct to "synchronize" async functions?
My desired behavior can be simulated in Golang using buffered channels.