Size: a a a

2021 October 26

D

Denis in Rust Async
ну, это уже всё вопрос банальной логики
источник

D

Denis in Rust Async
сам смотри, устраивает ли тебя такое поведение или нет
источник

LB

Let Eat Bee in Rust Async
async {
 let s = l.accept().await;
 app.handshake(s).await
}

если такое запихать select, то коннекты дропаются. я глаза сломал баг искать ) иными словами нельзя туда класть ничего где было б больше чем один await на всех уровнях внутри
источник

D

Denis in Rust Async
в общем случае — можно, конкретно в твоём случае — неразумно так делать, только и всего
источник

D

Denis in Rust Async
но таки да, надо держать в голове, что tokio::select! (да и не только он на самом деле) отменяет недовыполнившиеся футурки
источник

LB

Let Eat Bee in Rust Async
эта ппц неочевидная штука и в доке вообще про прием сообщений а не про футуры в целом ) прям мелкий шрифт в худших традициях)
источник

D

Denis in Rust Async
первая строчка доки селекта:
Wait on multiple concurrent branches, returning when the first branch completes, cancelling the remaining branches.

а дальше, целый подраздел Cancellation safety
источник

D

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

LB

Let Eat Bee in Rust Async
ну вот cancelling как-то в голове не связывается с тем, что всё дропается) и в разделе Cancellation какие то хитрые примеры , без объяснения общих принципов, что >1 await  на всю глубину футуры работать не будет
источник

D

Denis in Rust Async
да почему работать не будет? в общем случае — будет
источник

D

Denis in Rust Async
он "не будет" работать только если альтернативная ветка select'а сработает в этот момент
источник

LB

Let Eat Bee in Rust Async
как будет то? много бывают футур которые после дропа и пересоздания снова вернут то же самое значение? т.е. смогут восстановиться на ту же глубину где отменили и продолжить?
источник

D

Denis in Rust Async
ещё раз, если альтернативные ветки селекта не срабатывают, то всё отлично
источник

LB

Let Eat Bee in Rust Async
ну это как говорить, что если планировщик в ядре треды в нужном порядке на ЦПУ поставит, то всё отлично. селект пишут для того, что б иметь альтернативные ветки как раз
источник

D

Denis in Rust Async
вообще нет
источник

D

Denis in Rust Async
вот тебе пример, только сегодня писал
    tokio::select! {
       _ = tokio::signal::ctrl_c() => {
           log::info!("Received ctrl-c; terminating");
           Ok(())
       }
       e = mega_complex_future => Err(e),
   }

здесь всё супер, хотя mega_complex_future содержит очень много авейтов
источник

D

Denis in Rust Async
в общем, если тебе кажется, что дока к tokio::select! недостаточно подробная, то создавай ишью в токио, а ещё лучше — сразу PR с докой :))
источник

LB

Let Eat Bee in Rust Async
ну если другая ветка выходит из цикла,то получатеся нет цикла, нет проблемы
источник

D

Denis in Rust Async
ну вот видишь, есть кейсы, где всё можно :) и таких кейсов в общем-то очень много
но таки да, бывает такое, где это неприменимо
источник

D

Denis in Rust Async
кстати, есть дженерик-выход: запускай футуру через спавн, и запихивай в селект join handle
источник