Size: a a a

Rust — русскоговорящее сообществo

2020 March 13

MF

Max Frai in Rust — русскоговорящее сообществo
И подскажите, можно ли использовать синхронный RwLock в асинхронном коде, буквально записать в вектор данные
источник

MF

Max Frai in Rust — русскоговорящее сообществo
Если брать асинхронный RwLock, я его не смогу использовать в синхронном обработчике логики
источник

お願い誰か助けて in Rust — русскоговорящее сообществo
Господа, появился вопрос, может кто-то сталкивался с подобным?

Есть тип, который по сути обработчик (Fragment), принимающий что-то по ссылке и возвращающий что-то
Есть также структура, в которой хранится такой обработчик и имеющая метод, соединяющий обработчики

Проблема в том, что из-за ссылок в сигнатуре Fragment возникают проблемы с лайфтаймами
И в методе handler переменная не живёт достаточно долго для передачи в Fragment

Как лучше реализовать подобное, если не менять сигнатуру Fragment?

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=69e64141595249a5c356c342d602d95d
источник

AS

Andrei 🦉 Sergeev in Rust — русскоговорящее сообществo
Max Frai
И подскажите, можно ли использовать синхронный RwLock в асинхронном коде, буквально записать в вектор данные
нет

синхронный примитив заблокирует весь системный тред, а в этом же системном треде у тебя крутится весь event loop
источник

MF

Max Frai in Rust — русскоговорящее сообществo
А как тогда правильно сделать? Если мне нужно расшарить данные между асинхронным обработчиком тасков и синхронной обработкой этих тасков
источник

AS

Andrei 🦉 Sergeev in Rust — русскоговорящее сообществo
Max Frai
А как тогда правильно сделать? Если мне нужно расшарить данные между асинхронным обработчиком тасков и синхронной обработкой этих тасков
как там в го? коммуницируйте сообщениями, а не шарьте данные через память
источник

AS

Andrei 🦉 Sergeev in Rust — русскоговорящее сообществo
мне кажется лучше всего сделать так, чтобы синхронный обработчик посылал данные в канал, а асинхронный принимал эти данные и оперировал уже асинхронным локом
источник

MF

Max Frai in Rust — русскоговорящее сообществo
Скажите, а Arc не работает внутри асинхронных функций?
источник

MF

Max Frai in Rust — русскоговорящее сообществo
pub async fn loader_logic() {
   let browser = create_browser(); // Arc<Browser>
   loop {
       if let Some(task) = preloader_consumer.recv().await { }
   }
}
источник

MF

Max Frai in Rust — русскоговорящее сообществo
44  |     let browser = create_browser();
   |         ------- has type `std::sync::Arc<Browser>`
...
48  |         if let Some(task) = preloader_consumer.recv().await {
   |                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ await occurs here, with `browser` maybe used later
...
58  | }
   | - `browser` is later dropped here
источник

MF

Max Frai in Rust — русскоговорящее сообществo
Если убрать Arc, все ок компилируется
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Откуда появился preloader_consumer?
источник

r

red75prime in Rust — русскоговорящее сообществo
Max Frai
Если брать асинхронный RwLock, я его не смогу использовать в синхронном обработчике логики
А зачем RwLock нужен? Создать отдельную задачу владеющую ресурсом, которая будет последовательно обрабатывать запросы.
источник

MF

Max Frai in Rust — русскоговорящее сообществo
Вот проблема в том, что я хочу не последовательно, а пачками по 5
источник

MF

Max Frai in Rust — русскоговорящее сообществo
и если сейчас 5 задач в обработке, ждать
источник

r

red75prime in Rust — русскоговорящее сообществo
Доступ к ресурсу, требующемуся для обработки, синхронный или асинхронный? Или там 5 разных ресурсов?
источник

r

red75prime in Rust — русскоговорящее сообществo
Если просто ограничивать количество задач, то можно добавить дополнительную задачу, которая будет раскидывать запросы на 5 задач-обработчиков.
источник

В

Вафель in Rust — русскоговорящее сообществo
Anton 📦 ᯌ
Это же даже длиньше
зато не требует PartialEq и можно игнорироват часть полей
источник

AT

Alexander Tchitchigin in Rust — русскоговорящее сообществo
Внимание! 😃
источник

DK

Danila Kiver in Rust — русскоговорящее сообществo
1998
источник