mirror of
https://github.com/tokio-rs/tokio.git
synced 2026-08-23 00:00:10 +02:00
* add Child::try_wait to mirror the std API * replace Future impl on Child with `.wait()` method to bring our APIs closer to those in std and it allow us to internally fuse the future so that repeated calls to `wait` result in the same value (similar to std) without forcing the caller to fuse the outer future * Also change `Child::id` to return an Option result to avoid allowing the caller to accidentally use the pid on Unix systems after the child has been reaped * Also remove deprecated Child methods
39 lines
1.2 KiB
Rust
39 lines
1.2 KiB
Rust
#![warn(rust_2018_idioms)]
|
|
#![cfg(feature = "full")]
|
|
#![cfg(unix)]
|
|
|
|
use futures::future::join_all;
|
|
use std::process::Stdio;
|
|
use tokio::process::Command;
|
|
use tokio::task;
|
|
|
|
#[tokio::test]
|
|
async fn issue_42() {
|
|
// We spawn a many batches of processes which should exit at roughly the
|
|
// same time (modulo OS scheduling delays), to make sure that consuming
|
|
// a readiness event for one process doesn't inadvertently starve another.
|
|
// We then do this many times (in parallel) in an effort to stress test the
|
|
// implementation to ensure there are no race conditions.
|
|
// See alexcrichton/tokio-process#42 for background
|
|
let join_handles = (0..10usize).map(|_| {
|
|
task::spawn(async {
|
|
let processes = (0..10usize).map(|i| {
|
|
let mut child = Command::new("echo")
|
|
.arg(format!("I am spawned process #{}", i))
|
|
.stdin(Stdio::null())
|
|
.stdout(Stdio::null())
|
|
.stderr(Stdio::null())
|
|
.kill_on_drop(true)
|
|
.spawn()
|
|
.unwrap();
|
|
|
|
async move { child.wait().await }
|
|
});
|
|
|
|
join_all(processes).await;
|
|
})
|
|
});
|
|
|
|
join_all(join_handles).await;
|
|
}
|