Size: a a a

2020 July 12

IL

Ilya Lakhin in Rust Async
Почитал доки. Очень классная вещь. Эта штука концептуально похожа на Rx/RxJS
источник

IL

Ilya Lakhin in Rust Async
То что на первый взгляд сильно смущает, это то, что futures-signals использует в основе обычные блокирующие RwLock, которые, как я понял из документации, в частности блокируются во время триггера сигналов. И если сам сигнал оказался блокирующим, к примеру, при вызове for_each/map_future, мы фактически заблокируем поток, который в этот момент начнет записывать в источник сигнала. Это автоматически делает источники сигнала неприменимыми(либо неудобно применимыми) в рамках инфраструктуры Tokio или любого другого экзекьютора
источник

d

diabolo in Rust Async
Ilya Lakhin
То что на первый взгляд сильно смущает, это то, что futures-signals использует в основе обычные блокирующие RwLock, которые, как я понял из документации, в частности блокируются во время триггера сигналов. И если сам сигнал оказался блокирующим, к примеру, при вызове for_each/map_future, мы фактически заблокируем поток, который в этот момент начнет записывать в источник сигнала. Это автоматически делает источники сигнала неприменимыми(либо неудобно применимыми) в рамках инфраструктуры Tokio или любого другого экзекьютора
я бы на твоём месте сделал форк и заменил локи на tokio:: sync – работы на пару часов, а профит будет. там это сделано так, чтобы не привязываться к рантайму
источник

d

diabolo in Rust Async
а если сделаешь это как фичу, то будет повод сделать pr
источник

d

diabolo in Rust Async
насколько я знаю RwLock в отличии от Mutex в futures так и не завезли, надо посмотреть
источник

d

diabolo in Rust Async
источник

IL

Ilya Lakhin in Rust Async
Если независимость от рантайма была изначальной целью(что само по себе конечно правильно), вряд ли разработчик примет tokio-зависимые изменения
источник

IL

Ilya Lakhin in Rust Async
Может просто оборачивать все обращения к Mutable в tokio::spawn_blocking? Или плохая идея? )
источник

d

diabolo in Rust Async
Ilya Lakhin
Если независимость от рантайма была изначальной целью(что само по себе конечно правильно), вряд ли разработчик примет tokio-зависимые изменения
по крайней мере так позиционируется крейт, так что как рабочее решение свой форк, пока в futures не завезли RwLock.
источник

d

diabolo in Rust Async
Ilya Lakhin
Может просто оборачивать все обращения к Mutable в tokio::spawn_blocking? Или плохая идея? )
ну, я бы так не стал делать 😉
источник

IL

Ilya Lakhin in Rust Async
@diaevd Насколько spawn_blocking вообще дорогой? Это вопрос безотносительно обсуждаемой темы
источник

IL

Ilya Lakhin in Rust Async
Я его довольно интенсивно использую для взаимодействия с графической подсистемой, особенно там где CPU блокируется на операциях взаимодействия с GPU(ну, у меня задача такая просто, связанная с интенсивной работой с GPU)
источник

d

diabolo in Rust Async
не дороже простого spawn, главное чтобы в экзекуторе были свободные "blocking" потоки, если таких нет, то опаньки, тогда дороже — тогда новый тред стартуется
источник

d

diabolo in Rust Async
фактически там все просто, токио смотрит есть ли в пул свободный блокинг, если есть то футуру туда, если нет, то thread::spawn, добавляет его в пул и футуру туда
источник

IL

Ilya Lakhin in Rust Async
Почему бы тогда не завернуть операции работы с Mutable в spawn_blocking? У меня, к слову, не весь далеко код неблокирующий. В некоторых случаях мне наоборот нужно работать с данными в обычном треде, независимом от Tokio
источник

d

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

d

diabolo in Rust Async
Ilya Lakhin
Почему бы тогда не завернуть операции работы с Mutable в spawn_blocking? У меня, к слову, не весь далеко код неблокирующий. В некоторых случаях мне наоборот нужно работать с данными в обычном треде, независимом от Tokio
так spawn_blocking обычно и юзают для синхронного и как правило блокирующего
источник

d

diabolo in Rust Async
поэтому и потоки помечены как blocking
источник

AV

A V in Rust Async
Ilya Lakhin
Блин, не хочется сильно углубляться в архитектуру ) В общем, я работаю фактически над пользовательским интерфейсом. Есть события, сгенерированные(условно говоря) пользователем, которые нужно обрабатывать. И есть несколько обработчиков, часть из которых сидят в бэкграунде, имеют свое внутреннее состояние, и просыпаются, когда нужно сделать что-то полезное. Обработчики могут быть связаны друг с другом, и ожидать результата друг от друга
источник

IL

Ilya Lakhin in Rust Async
А как он мне поможет?
источник