Size: a a a

2021 February 02

r

red75prime in Rust Async
Так сделать его футурой
источник

IL

Ilya Lakhin in Rust Async
Ilya Lakhin
Привет!

Есть такой примитив синхронизации, как Tokio Notify, но чтобы он не расходовал permit при вызове Notify::notified?
Это, кстати, тот самый вопрос который я тут задавал
источник

r

red75prime in Rust Async
red75prime
Так сделать его футурой
async { loop { if flag { return something; } else { timer.await } } }
источник

MB

Mikail Bagishov in Rust Async
Ilya Lakhin
Привет!

Есть такой примитив синхронизации, как Tokio Notify, но чтобы он не расходовал permit при вызове Notify::notified?
Звучит как CancellationToken из  tokio-util.
источник

MB

Mikail Bagishov in Rust Async
Ну или аналог с каналами намутить
источник

IL

Ilya Lakhin in Rust Async
Я пока ограничился чтением Notify  в одном единственном месте, и OnceCell<()> в качестве индикатора
источник

IL

Ilya Lakhin in Rust Async
Mikail Bagishov
Звучит как CancellationToken из  tokio-util.
Если сделать cancel, а затем подписаться на cancelled(), то cancelled сразу сработает или залочится?
источник

MB

Mikail Bagishov in Rust Async
Ilya Lakhin
Если сделать cancel, а затем подписаться на cancelled(), то cancelled сразу сработает или залочится?
Сработает сразу
источник

IL

Ilya Lakhin in Rust Async
ок. спс
источник

IL

Ilya Lakhin in Rust Async
Если бы ещё был такой же примитив, но который мог бы хранить внутри какое-нибудь значение, было бы вообще идеально )
источник

MB

Mikail Bagishov in Rust Async
Я бы смотрел на tokio::sync::watch
источник

MB

Mikail Bagishov in Rust Async
Можно хранить в нем Option<T> (изначально None, а потом Some(x) когда значение появилось)
источник

IL

Ilya Lakhin in Rust Async
Ну а как это сделать на практике? Вот я хочу понять, когда попаду в специальное состояние. Я, например, читаю borrow(), он мне говорит что состояние пока не специальное(None), тогда я подписываюсь на changed. А пока подписывался - состояние перешло в специальное
источник

IL

Ilya Lakhin in Rust Async
И у меня changed() в результате залочился навсегда
источник

MB

Mikail Bagishov in Rust Async
let fut = rx.changed();
if rx.borrow().is_none() {
   fut.await;
}

кажется вот так должно сработать
источник

MB

Mikail Bagishov in Rust Async
А, хотя даже проще.

rx.borrow();
rx.changed().await;

тоже будет работать
источник

MB

Mikail Bagishov in Rust Async
Документация говорит, что .changed() отслеживает изменения не с начала своего исполнения, а с предыдущего вызова changed()
источник

IL

Ilya Lakhin in Rust Async
Но она не говорит, относится ли это к данном инстансу ресивера, или ко всему каналу )
источник

IL

Ilya Lakhin in Rust Async
Вообще, вотч по-моему может лагать, не?
источник

IL

Ilya Lakhin in Rust Async
Хотя на самом деле, учитывая что меня инетерсует ровно один единственый переход, можно просто дропать сендер. Тогда changed() будет всегда выходить сразу
источник