Size: a a a

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

2021 June 27

Э

Эрик in Rust — русскоговорящее сообщество
Смотри, у этих двух функций есть одно большое отличие

fn bar(cancel_flag: bool) {
 println!("Hello");
 if cancel_flag { panic!(); }
 println!("World");
}

async fn bar() {
 println!("Hello");
 qwe().await;
 println!("World");
}

Паника уронит тебе всё вплоть до первого detached треда / catch_unwind / джойна с обработкой паники без паники.
А вот кенсел в await тебе ничего не уронит.

Когда у тебя что-то паникует, оно паникует очень громко. А когда у тебя что-то кенселится, оно кенселится очень тихо.

В остальном разницы между функциями практически нет, и думать тебе про эти функции надо примерно одинаково.
источник

n

n1 in Rust — русскоговорящее сообщество
Там не где-то посередине - result?
источник

A

Andrew in Rust — русскоговорящее сообщество
А почему тогда кенцел молча падает, разве это не нарушает гарантии? И резалт не должен вернуться при кенцеле асинк функции?
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообщество
отмена футуры это не какое-то магическое действие. Это просто ее дроп.
источник

Э

Эрик in Rust — русскоговорящее сообщество
Нет, резалты — это результат выполнения функции, если она не кенселится. Всегда когда видишь await думай, что тут может нихрена дальше не выполниться, прямо как при панике, только не как при панике.
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообщество
В принципе можно запретить отмену, храня в футуре значение-бомбу (которое паникует при дропе), но никогда не видел чтобы кто-то так делал
источник

n

n1 in Rust — русскоговорящее сообщество
Ок, (возвращаясь к примеру), дропнули один «поток» исполнения, почему в другом кривая нарезка строки получилась?
источник

Э

Эрик in Rust — русскоговорящее сообщество
Я писал уже вот тут.
источник

Э

Эрик in Rust — русскоговорящее сообщество
И вот тут.
источник

TK

Traveller Kolsky in Rust — русскоговорящее сообщество
Данные уже прочли из сети, но не использовали, а её состояние уже изменилось к следующей попытке
источник

n

n1 in Rust — русскоговорящее сообщество
Кажется дошло, данных уже нет, но пытаемся их прочитать. Но в целом логично, что не стоит их разрывать. Там выше пример был с общим tcp, тоже по теме
источник

Э

Эрик in Rust — русскоговорящее сообщество
Ладно, если всё ещё неясно, то давай совсем простой пример:

struct Qwe(Option<usize>, Vec<i32>);

fn new() -> Qwe {
 Qwe(Some(0), vec![5])
}

fn read_x(stream: &mut Qwe, cancel_flag: bool) -> i32 {
 let idx = stream.0.take().expect("valid Qwe");
 if cancel_flag { panic!(); }
 let x = stream.1[idx];
 std::mem::replace(stream, Qwe::new());

 x
}

А теперь попробуем эту фигню вызвать вот так:

let qwe = Arc::new(Mutex::new(Qwe::new()));
let clo = Arc::clone(&qwe);
catch_unwind(move || read_x(&mut *clo.lock().unwrap(), true));
read_x(&mut *qwe.lock().unwrap(), false);

Предскажешь результат?
источник

n

n1 in Rust — русскоговорящее сообщество
Но как и чтение / запись данных из нескольких потоков
источник

n

n1 in Rust — русскоговорящее сообщество
Я туго понимаю, почему паника используется, да и в целом мой парсер (в голове) раста так себе. В данном случае, по-моему, паника (из-за cancel flag)
источник

Э

Эрик in Rust — русскоговорящее сообщество
Не-а, запаникует из-за expect("valid Qwe");
источник

n

n1 in Rust — русскоговорящее сообщество
Я оффлайн, в любом случае, всем спасибо, мне нужно переварить полученную инфу
источник

n

n1 in Rust — русскоговорящее сообщество
Там же some(0), значение есть
источник

Э

Эрик in Rust — русскоговорящее сообщество
Паника используется потому что она реально очень похожа на кенсел футуры.

У нас std::mem::replace(stream) стоит после паники, так что если мы запаникуем из-за cancel_flag, оно никогда не выполнится, соответственно у нас stream остаётся в виде тыквы после stream.0.take().
источник

TK

Traveller Kolsky in Rust — русскоговорящее сообщество
Скорее кенсел похож на панику, раз уж паника истинно присутствует везде в неявном виде, пачкая любые функции, а кенсел программный (руками воспроизводится без паник при написании похожего комбинатора) и только в определённом контексте действителен.
источник

Э

Эрик in Rust — русскоговорящее сообщество
Да там оба друг на друга похожи, и ещё неясно, кто из них первым родился: дроп футурной стейт машины или дроп растового рантайма (стейт машины).
источник