Почему asyn c -std task :: spawn предотвращает выполнение последующих строк кода? - PullRequest
0 голосов
/ 08 июля 2020

Я пытаюсь использовать asyn c -std task::spawn:

use std::time::Duration;

async fn w() {
    loop {
        task::sleep(Duration::from_secs(1)).await;
        println!("Tick");
    }
}

#[async_std::main]
async fn main() {
    println!("Start");
    task::spawn(w()).await;
    println!("End");
}

Я ожидаю, что «End» печатается сразу после «Start», но «Tick» l oop печатается бесконечно.

Так в чем же разница со следующим?

#[async_std::main]
async fn main() {
    println!("Start");
    w().await;
    println!("End");
}

1 Ответ

3 голосов
/ 08 июля 2020

Не .await порожденная задача. Это похоже на присоединение к потоку: он ожидает завершения задачи sh, прежде чем продолжить. Дескриптор spawn возвращает не нужно ждать, чтобы задача была доведена до завершения.

task::spawn(w())<del>.await</del>;

Как написано, вы правы, что task::spawn(w()).await не отличается от w().await. Они оба блокируют поток, ожидающий от w() до fini sh.

Тогда какова цель ожидания вызова вызова? Это полезно, если вы хотите запустить фоновую задачу, выполнить другую работу в текущем потоке и , затем блок.

let handle = task::spawn(w());

do_other_things_for_a_while();

// Block and retrieve the result.
let result = handle.await;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...