Size: a a a

2020 July 12

AV

A V in Rust Async
@eliah_lakhin Отправляешь эвенты с кнопок в вотч-канал, а далее:

while let Some(event) = rcv.recv().await {
 futures::join_all(
   tokio::spawn(actor1.process_event(event.clone()))
   tokio::spawn(actor2.process_event(event.clone()))
   tokio::spawn(actor3.process_event(event.clone()))
 ).await;
}
источник

AV

A V in Rust Async
можно жонглировать join, spawn и timeout в зависимости от желаемой логики обработки
источник

AV

A V in Rust Async
хотя наверное лучше обычный mpsc использовать чтобы не пропустить ни одно событие
источник

IL

Ilya Lakhin in Rust Async
@vorot93 Вообще, у меня проблема не с изначальными каналами, а в том, как аккуратно организовать аборт всей системы. Я сейчас уже построил некоторый прототип того что хочу на mpsc и watch, он в принципе работает, хотя получилась довольно тяжелая мешанина из каналов
источник

AV

A V in Rust Async
а в чём проблема с абортом? дропаешь все примитивы и всё
источник

AV

A V in Rust Async
или у тебя вопрос как остановить таски запущенные через tokio::spawn?
источник

AV

A V in Rust Async
Ilya Lakhin
И если один актор инициировал некую работу другому актору, а тот потом третьему, мне нужно, чтобы эта цепочка закончилась. Если я ее прерву, просто уничтожив один из акторов, то вся система повиснит
ааа, вообще это проблема, да, потому что на языке асинка это называется async drop
источник

AV

A V in Rust Async
надо городить костыли
источник

AV

A V in Rust Async
классическая задача - дропнуть TcpStream так, чтобы отправить прощальное сообщение серверу
источник

IL

Ilya Lakhin in Rust Async
Таски, как мне посоветовали выше, можно останавливать через AbortHandle. Я у себя их в настоящий момент останавливаю через Tokio Notify, который сигнализирует таске о том, что ее нужно остановить. Возможно, через AbortHandle, это было бы сделать проще, я так и планирую попробовать, но проблема в том, что иногда таски ждут результата выполнения других тасок. Если ее просто прервать, то связанная таска оказывается повисшей
источник

IL

Ilya Lakhin in Rust Async
То есть, таска отправила некоторую информацию другой таске и Notify, которая та таска должна выполнить, чтобы изначальная узнала, что задача выполнена. Если удаленную таску остановить раньше, то изначальная никогда не закончится
источник

IL

Ilya Lakhin in Rust Async
Ну, это то, как я сейчас сделал, и это конечно наверное не очень правильно
источник

AV

A V in Rust Async
кхм, я никогда не использовал notify
источник

AV

A V in Rust Async
только oneshot
источник

AV

A V in Rust Async
можешь заспавнить таску, положить в неё oneshot sender, и зависнуть на receiver
источник

d

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

AV

A V in Rust Async
дочерняя таска или отправит значение в sender, или вообще его дропнет - первая таска в любом случае получит результат, по которому ты сможешь понять что и как
источник

d

diabolo in Rust Async
A V
дочерняя таска или отправит значение в sender, или вообще его дропнет - первая таска в любом случае получит результат, по которому ты сможешь понять что и как
вот для этого futures-signals и делалось
источник

AV

A V in Rust Async
@eliah_lakhin а ты не можешь просто повиснуть на JoinHandle?
источник

d

diabolo in Rust Async
A V
@eliah_lakhin а ты не можешь просто повиснуть на JoinHandle?
у него не линейная зависимость
источник