tx1.send("hello").unwrap();
assert!(join.is_woken()); let res = assert_ready!(join.poll());
assert_eq!(("hello", 123), res);
}
#[test] #[cfg(target_pointer_width = "64")] fn join_size() { use futures::future; use std::mem;
let fut = async { let ready = future::ready(0i32);
tokio::join!(ready)
};
assert_eq!(mem::size_of_val(&fut), 32);
let fut = async { let ready1 = future::ready(0i32); let ready2 = future::ready(0i32);
tokio::join!(ready1, ready2)
};
assert_eq!(mem::size_of_val(&fut), 40);
}
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;
}
how_many_times_i_got_to_run
}
#[tokio::test] asyncfn join_does_not_allow_tasks_to_starve() { let permits = Arc::new(Semaphore::new(1));
// non_cooperative_task should yield after its budget is exceeded and then poor_little_task should run. let (non_cooperative_result, little_task_result) = tokio::join!(
non_cooperative_task(Arc::clone(&permits)),
poor_little_task(permits)
);
// 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()
);
}
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.