Size: a a a

2021 January 12

MB

Mikail Bagishov in Rust Async
Возможно ты случайно делаешь какой-то блокирующий код
источник

ph

pl 🦑 hk in Rust Async
без минимального примера будет сложно понять, что пошло не так
источник

MB

Mikail Bagishov in Rust Async
tokio-compat-02 использует однопоточный рантайм токио, поэтому по идее он очень чувствителен к багам с блокированием в синхронном коде.
источник

f

folex in Rust Async
А есть какой-то аналог select!, который ветки исполняет в бэкграунде/отдельных фьючах?

У меня есть поток входящих сообщений, и я хожу их обрабатывать конкурентно, fanout по потокам или как-нибудь так
источник

f

folex in Rust Async
Я могу руками конечно запускать task::spawn, но это же нужно писать бойлерплейт чтобы эти фьючи поллились, накосячу еще где-нибудь.
источник

f

folex in Rust Async
Вижу есть parallel-stream и rayon
источник

ph

pl 🦑 hk in Rust Async
folex
Я могу руками конечно запускать task::spawn, но это же нужно писать бойлерплейт чтобы эти фьючи поллились, накосячу еще где-нибудь.
Какой бойлерплейт?
источник

f

folex in Rust Async
Не уверен. Что-то типа

let futures = select! {
  msg = fused_stream.next() => {
    task::spawn(f(msg))
  }
}

poll_futures(futures)


но я не пробовал еще так делать, так что это псевдокод
источник

f

folex in Rust Async
Хотя, хм, task::spawn же не надо поллить, оно само запускается, а возвращает лишь JoinHandler.
источник

f

folex in Rust Async
Еще из минусов у такого подхода – нет backpressure
источник

f

folex in Rust Async
у меня fused_stream это mpsc::channel, и у него есть backpressure, и это хорошо. А если читать в task::spawn, то оно будет бесконечно читать, и забивать экзекьютор фьючами. Это мб роскошь, но хотелось бы как-то получше обращаться с экзекьютором
источник

f

folex in Rust Async
По хорошему хотелось бы ограничить кол-во одновременно сущствующих future, запущенных таким образом. Но как за этим следить в подходе с msg = next() => { task::spawn(..) }?  🤔
источник

ph

pl 🦑 hk in Rust Async
источник

ph

pl 🦑 hk in Rust Async
источник

f

folex in Rust Async
Спасибо! Я пока остановился на for_each_concurrent.
источник

f

folex in Rust Async
Правда, набрел на непонятную ошибку – никогда не встречал такую.
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=fcacd1e1a21b594688681c502a3c4a90

> move occurs due to use in generator
источник

f

folex in Rust Async
т.е. вот такой вот паттерн
let value: Arc<Mutex<..>> = ..;
let cloned_value = value.clone();
FnMut: || { async move {
 let value = cloned_value.clone();
 foo(value)
} }


почему-то говорит, что move случается лишний. Хотя вроде бы везде всё клонируется
источник

DN

Denis Nevmerzhitskii in Rust Async
folex
т.е. вот такой вот паттерн
let value: Arc<Mutex<..>> = ..;
let cloned_value = value.clone();
FnMut: || { async move {
 let value = cloned_value.clone();
 foo(value)
} }


почему-то говорит, что move случается лишний. Хотя вроде бы везде всё клонируется
Попробуй клонировать в замыкании, но перед async блоком
источник

f

folex in Rust Async
хм, кажется сработало! спасибо
источник

DN

Denis Nevmerzhitskii in Rust Async
В первом случае клон вызывался один раз, и первый же async блок забрал бы его
источник