Size: a a a

2021 January 07

F

Fortunato in Rust Async
Осознаю асинк. Ниже пример из async book.
Я правильно понимаю, что управение перейдёт к sing_song(song) (3 строка), только когда до конца полностью отработает предыдущая строка, learn_song().await?
А пока learn_song().await заблокирована, то будет работать какая-то другая задача, но не сама функция learn_and_sing()?
async fn learn_and_sing() {
   let song = learn_song().await;
   sing_song(song).await;
}

async fn async_main() {
   let f1 = learn_and_sing();
   let f2 = dance();

   futures::join!(f1, f2);
}

fn main() {
   block_on(async_main());
}
источник

VS

Vladimir SHCHerba in Rust Async
Ну да.
источник

F

Fortunato in Rust Async
Т.е. .await прямо блокирует выполнение функции, в которой этот .await вызван, до тех пор, пока операция полностью не завершится?
источник

С

Сергей in Rust Async
Fortunato
Т.е. .await прямо блокирует выполнение функции, в которой этот .await вызван, до тех пор, пока операция полностью не завершится?
Да. Иначе никак не получить song, пока функция не завершилась.
источник

F

Fortunato in Rust Async
Отлично, спасибо. С ващей помощью я стал ещё чуть ближе к асинку
источник

D

Denis in Rust Async
Fortunato
Т.е. .await прямо блокирует выполнение функции, в которой этот .await вызван, до тех пор, пока операция полностью не завершится?
ну он не блокирует
источник

D

Denis in Rust Async
это нельзя называть блокировкой, таска возвращает управление в экзекутор, если футура возвращает NotReady
источник

F

Fortunato in Rust Async
Denis
это нельзя называть блокировкой, таска возвращает управление в экзекутор, если футура возвращает NotReady
Ну да, это не блокировка потока, это приостановка выполнения текущей функции
источник

D

Denis in Rust Async
Fortunato
Ну да, это не блокировка потока, это приостановка выполнения текущей функции
ага
источник

F

Fortunato in Rust Async
Так, я тогда не понимаю. А вот такой код что, будет работать полностью как синхронный?
async fn learn_and_sing() {
   let song = learn_song().await;
   sing_song(song).await;
}

async fn async_main() {
   let f1 = learn_and_sing().await;
   let f2 = dance().await;
}

fn main() {
   block_on(async_main());
}
источник

D

Denis in Rust Async
ммм, нет, с чего бы ему работать как синхронный?..
источник

D

Denis in Rust Async
и что такое .async?)
источник

F

Fortunato in Rust Async
Denis
и что такое .async?)
Тьфу, совсем уже шарики за ролики у меня. Пофиксил
источник

RP

Roman Proskuryakov in Rust Async
оно будет работать последовательно с приостановками
источник

F

Fortunato in Rust Async
Denis
ммм, нет, с чего бы ему работать как синхронный?..
Ну, строка let f1 = learn_and_sing().await; приостановит выполнение функции async_main(), соответственно и dance() будет вызвана только после того, как завершится предыдущая строка
источник

RP

Roman Proskuryakov in Rust Async
ага
источник

RP

Roman Proskuryakov in Rust Async
если ты хочешь f1 и f2 параллельно, тебе нужны join/select или их самописные аналоги
источник

F

Fortunato in Rust Async
Roman Proskuryakov
оно будет работать последовательно с приостановками
Ага. Т.е. полностью аналогично коду бед асинк/эвейт. Но зачем тогда...
источник

D

Denis in Rust Async
Fortunato
Ну, строка let f1 = learn_and_sing().await; приостановит выполнение функции async_main(), соответственно и dance() будет вызвана только после того, как завершится предыдущая строка
тут важно понимать, что асинхронность имеет крайне мало общего с "параллельностью"
источник

D

Denis in Rust Async
Fortunato
Ага. Т.е. полностью аналогично коду бед асинк/эвейт. Но зачем тогда...
вообще не аналогично
источник