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

Функция block_on

Источник: Документация async-io::block_on

#![allow(unused)]
fn main() {
pub fn block_on<T>(future: impl Future<Output = T>) -> T
}

Блокирует текущий поток на фьючерсе, обрабатывая I/O события в простое.

Описание

Функция block_on выполняет асинхронный фьючерс в текущем потоке, блокируя его до завершения фьючерса. Во время выполнения она обрабатывает I/O события, когда поток простаивает.

Эта функция предоставляет простой способ запуска асинхронного кода в синхронном контексте.

Примеры

#![allow(unused)]
fn main() {
use async_io::Timer;
use std::time::Duration;

async_io::block_on(async {
    // Этот таймер, вероятно, будет обработан текущим
    // потоком, а не резервным потоком "async-io".
    Timer::after(Duration::from_millis(1)).await;
});
}

Особенности реализации

  • Обработка I/O: Во время ожидания завершения фьючерса функция обрабатывает события ввода-вывода
  • Эффективность: Использует текущий поток для обработки, что может быть более эффективно, чем использование отдельного исполнителя
  • Универсальность: Может работать с любым фьючерсом, возвращающим значение типа T

Типичные сценарии использования

Запуск асинхронного кода в синхронном контексте

use async_io::block_on;

fn main() {
    let result = block_on(async {
        // Асинхронные операции
        "Результат асинхронной операции"
    });
    
    println!("{}", result);
}

Ожидание таймаутов

#![allow(unused)]
fn main() {
use async_io::{block_on, Timer};
use std::time::Duration;

block_on(async {
    Timer::after(Duration::from_secs(1)).await;
    println!("Прошла 1 секунда");
});
}

Совместное использование с другими асинхронными примитивами

#![allow(unused)]
fn main() {
use async_io::block_on;
use async_net::TcpStream;
use std::io;

block_on(async {
    match TcpStream::connect("example.com:80").await {
        Ok(_) => println!("Подключение успешно"),
        Err(e) => println!("Ошибка подключения: {}", e),
    }
});
}

Отличие от других исполнителей

В отличие от специализированных исполнителей, block_on:

  • Работает в текущем потоке без создания дополнительных потоков
  • Обрабатывает I/O события только когда фьючерс ожидает
  • Подходит для простых сценариев и тестирования

Ограничения

  • Блокирует текущий поток до завершения фьючерса
  • Не подходит для длительных операций в GUI-приложениях
  • Для сложных сценариев предпочтительнее использовать полноценный исполнитель

Параметры

  • future: Фьючерс, который нужно выполнить. Должен реализовывать Future<Output = T>

Возвращаемое значение

  • Возвращает результат выполнения фьючерса типа T