Size: a a a

2021 November 01

f

folex in Rust Async
перед каждым start_send скидывается хук. Осталось понять, что такое хук 🙂
источник

D

Denis in Rust Async
можно юзать из токио, там схема как описана в ишью, когда выдаётся пермит, что исключает возможность блокировки в случае прерывания футурки
источник

f

folex in Rust Async
пермит = гарантия свободного слота?
источник

D

Denis in Rust Async
да
источник

f

folex in Rust Async
у меня нет проблемы с блоками. Я подозреваю проблему с liveness: навыдавали пермитов/гарантий слота, и встали.
источник

D

Denis in Rust Async
ну, при дропе футуры он возвращается
источник

f

folex in Rust Async
как?
источник

f

folex in Rust Async
poll_ready возвращает просто unit, там вроде нет никакого способа сказать "disarm_ready", ишьюс как раз об этом
источник

V

Vetro in Rust Async
просто токийные каналы как раз и не юзают Sink/Stream)
источник

D

Denis in Rust Async
ну посмотри код https://docs.rs/tokio/1.13.0/tokio/sync/mpsc/struct.Sender.html
там нет poll_ready и прочего интерфейса Sink'ов
источник

f

folex in Rust Async
ааа, этого я не знал
источник

f

folex in Rust Async
Понятно, permit-ы дропаются и всё хорошо
источник

D

Denis in Rust Async
ну, как минимум в теории — это так :)
источник

V

Vetro in Rust Async
а flume как раз через хуки тоже реализует пермиты
источник

f

folex in Rust Async
Ну, а с futures::mpsc::Sender похоже проблема есть
источник

V

Vetro in Rust Async
и при этом может в Sink/Stream трейты
источник

D

Denis in Rust Async
угу, похоже на то
источник

f

folex in Rust Async
Блин, это что ж получается... Вот есть у меня код

fn poll(self, cx: &mut ...) -> Poll {
 loop {
   if channel.poll_ready().is_ok() {
     if let Some(msg) = queue.pop { channel.
start_send(msg) }
   }
 }
}


и он моментально убьет channel? 🤔
источник

D

Denis in Rust Async
ну не моментально )
источник

f

folex in Rust Async
Я посмотрел на реализацию, ничего не резервируется
источник