Структура Barrier
pub struct Barrier { /* private fields */ }
sync.Барьер позволяет нескольким задачам синхронизировать начало вычислений.
use tokio::sync::Barrier;
use std::sync::Arc;
let mut handles = Vec::with_capacity(10);
let barrier = Arc::new(Barrier::new(10));
for _ in 0..10 {
let c = barrier.clone();
// The same messages will be printed together.
// You will NOT see any interleaving.
handles.push(tokio::spawn(async move {
println!("before wait");
let wait_result = c.wait().await;
println!("after wait");
wait_result
}));
}
// Will not resolve until all "after wait" messages have been printed
let mut num_leaders = 0;
for handle in handles {
let wait_result = handle.await.unwrap();
if wait_result.is_leader() {
num_leaders += 1;
}
}
// Exactly one barrier will resolve as the "leader"
assert_eq!(num_leaders, 1);Реализации
impl Barrier
pub fn new(n: usize) -> Barrier
Создаёт новый барьер, который может блокировать заданное количество задач.
Барьер будет блокировать n-1 задач, вызвавших Barrier::wait, а затем одновременно разблокирует все задачи, когда n-я задача вызовет wait.
pub async fn wait(&self) -> BarrierWaitResult
Не завершается, пока все задачи не соберутся здесь.
Барьер можно использовать повторно после того, как все задачи собрались у него, и применять непрерывно.
Один (произвольный) future получит BarrierWaitResult, для которого BarrierWaitResult::is_leader вернёт true при возврате из этой функции, а все остальные задачи получат результат, для которого is_leader вернёт false.
Безопасность при отмене
Этот метод не является безопасным при отмене.
Реализации трейтов
Автоматические реализации трейтов
impl !Freeze for Barrier
impl !RefUnwindSafe for Barrier
impl !UnwindSafe for Barrier
impl Send for Barrier
impl Sync for Barrier
impl Unpin for Barrier
impl UnsafeUnpin for Barrier
Общие реализации
impl<T> BorrowMut<T> for Twhere T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> Instrument for T
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
impl<T> WithSubscriber for T
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ
Subscriber к этому типу и возвращает обёртку WithDispatch. Подробнее
MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/sync/struct.Barrier.html