Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Tokio

Tokio предоставляет:

  • Многопоточный рантайм для выполнения асинхронного кода.
  • Асинхронную версию стандартной библиотеки.
  • Большую экосистему библиотек.
// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0

use tokio::time;

async fn count_to(count: i32) {
    for i in 0..count {
        println!("Count in task: {i}!");
        time::sleep(time::Duration::from_millis(5)).await;
    }
}

#[tokio::main]
async fn main() {
    tokio::spawn(count_to(10));

    for i in 0..5 {
        println!("Main task: {i}");
        time::sleep(time::Duration::from_millis(5)).await;
    }
}
  • С помощью макроса tokio::main мы теперь можем сделать main асинхронной.

  • Функция spawn создаёт новую конкурентную «задачу».

  • Примечание: spawn принимает Future, поэтому не нужно вызывать .await у count_to.

Дальнейшее изучение:

  • Почему count_to не доходит до 10? Это пример отмены асинхронной операции. tokio::spawn возвращает дескриптор, который можно дождаться через .await, чтобы подождать его завершения.

  • Попробуйте count_to(10).await вместо запуска в отдельной задаче.

  • Попробуйте дождаться задачи, возвращённой из tokio::spawn.