#[test] #[cfg(target_pointer_width = "64")] fn join_size() { use futures::future; use std::mem;
let fut = async { let ready = future::ready(ok(0i32));
tokio::try_join!(ready)
};
assert_eq!(mem::size_of_val(&fut), 32);
let fut = async { let ready1 = future::ready(ok(0i32)); let ready2 = future::ready(ok(0i32));
tokio::try_join!(ready1, ready2)
};
assert_eq!(mem::size_of_val(&fut), 48);
}
for _ in0..5 { // Another task should run after this task uses its whole budget for _ in0..128 { let _permit = permits.clone().acquire_owned().await.unwrap();
}
for _ in0..5 { let _permit = permits.clone().acquire_owned().await.unwrap();
how_many_times_i_got_to_run += 1;
}
Ok(how_many_times_i_got_to_run)
}
#[tokio::test] asyncfn try_join_does_not_allow_tasks_to_starve() { let permits = Arc::new(Semaphore::new(10));
// non_cooperative_task should yield after its budget is exceeded and then poor_little_task should run. let result = tokio::try_join!(
non_cooperative_task(Arc::clone(&permits)),
poor_little_task(permits)
);
let (non_cooperative_result, little_task_result) = result.unwrap();
// Each time the future created by join! is polled, it should start // by polling a different future first.
assert_eq!(
vec![1, 2, 3, 2, 3, 1, 3, 1, 2, 1, 2, 3],
*poll_order.lock().unwrap()
);
}
#[tokio::test] asyncfn empty_try_join() {
assert_eq!(tokio::try_join!() as Result<_, ()>, Ok(()));
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.9 Sekunden
(vorverarbeitet am 2026-06-18)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.