Size: a a a

2022 January 19

YT

Yauheni Tsiarokhin in Rust Async
я не понимаю почему самоссылающаяся

кто на кого ссылку держит?
источник

D

Denis in Rust Async
Pending должно ссылаться на Inserter, не?
источник

YT

Yauheni Tsiarokhin in Rust Async
нет

pending это просто какаято футура которую синк возможно сейчас крутит (вроде)
источник

D

Denis in Rust Async
ну как это нет, когда да? pub fn write<'a>(&'a mut self, row: &T) -> impl Future<Output = Result<()>> + 'a + Send
источник

YT

Yauheni Tsiarokhin in Rust Async
разве то что тут лайфтайм пророс значит что это самоссылающаяся конструкция?
источник

r

red75prime in Rust Async
Там не то, чтобы самоссылающаяся структура. Inserter::write создаёт футуру, которая блокирует self (&'a mut self), до тех пора пока футура не разрешится. Но start_send не блокирует self на это время, хотя должен.
источник

D

Denis in Rust Async
сейчас это НЕ самоссылающаяся структура, но вот здесь — self.pending = Some(pending); —  получается, что поле pending ссылается на поле inserter из-за того, что метод Inserter::write возвращает футуру, которая захватывает &mut self, и поэтому не сходятся лайфтаймы
вот чтобы они сошлись, нужна самоссылающаяся структура
или сделать так, чтобы  футура, которую возвращает Inserter::write, НЕ захватывала &mut self
источник

r

red75prime in Rust Async
В общем, убрать + 'a из возвращаемого типа write и исправлять дальше
источник

YT

Yauheni Tsiarokhin in Rust Async
это библиотечная функция к сожалению
источник

r

red75prime in Rust Async
У этого Inserter'а не выставлен наружу интерфейс, позволяющий дёргать poll напрямую?
источник

YT

Yauheni Tsiarokhin in Rust Async
не

честно говоря я думал что тот интерфейс который я дергал и был таковым но после вашего объяснения я чтото вообще не понимаю как синк реализовать
источник

YT

Yauheni Tsiarokhin in Rust Async
конечно есть авриант не реализовывать синк вовсе
источник

r

red75prime in Rust Async
async/await немного магический. Конечный автомат, который он создаёт, может содержать ссылки на самого себя плюс мутабельная ссылка на КА у экзекутора. А у poll'ов такой магии нет. Так что да, в safe коде может быть и невозможно реализовать.
источник
2022 January 20

II

Ivan Ivanov in Rust Async
Привет, асинкеры) Против вас играет телезритель из города Санкт-Петербург, внимание на экран:

#[tokio::main]
async fn main() {
   //some code here
   tokio::spawn(async move {
       loop {
           debug!("loop iter");
           sleep(Duration::from_millis(1000));
       }
   });
   let r = sync::subscribe(quotes, move |data| {
       //
   })
   .await;
}

Локально все работает. Заливаю на виртуалку - до subscribe никогда не доходит. Каким-то чудом понял, что проблема в том что виртуалка однопроцессорная. Увеличил до 2х - работает. В чем дело, дорогая редакция?
источник

IT

Ilya Titkov in Rust Async
Нужно использовать sleep из tokio
источник

II

Ivan Ivanov in Rust Async
попробую, спасибо
рили std'шный как-то пролез, а я даже не пытался в await
источник

IT

Ilya Titkov in Rust Async
С stdшным таска прост никогда не отдаёт управление и получается только у неё работать, на 1 ядерной тачке токио делает 1 тред, поэтому дальше не работает. Когда больше ядер ты просто блокируешь один тред рантайма навсегда, а остальные работают
источник

II

Ivan Ivanov in Rust Async
странно что клиппи молчит по данному вопросу
источник

ИК

Иван Кривошеев... in Rust Async
Можно попробовать запилить им issue, но не очень понятно, как это будет выглядеть
источник

ИК

Иван Кривошеев... in Rust Async
Практика использования синхронного кода в асинке - это нормально. У вас вполне очевидна ошибка и иногда она может быть логической
источник