Spec-Zone.ru › Tokio

Функция block_in_place

pub fn block_in_place<F, R>(f: F) -> R
where F: FnOnce() -> R,
Доступна только при включённых функциях crate rt-multi-thread и rt.

Запускает указанную блокирующую функцию в текущем потоке, не блокируя планировщик.

В общем случае выполнение блокирующего вызова или интенсивных вычислений в future без передачи управления проблематично, поскольку это может помешать планировщику выполнять другие задачи. Вызов этой функции сообщает планировщику, что текущая выполняемая задача собирается заблокировать поток, поэтому планировщик может передать остальные задачи новому рабочему потоку до того, как это произойдёт. Подробнее см. в разделе Задачи с интенсивными вычислениями и блокирующий код.

Обратите внимание: хотя эта функция не позволяет другим независимо запущенным задачам оставаться без процессорного времени, любой другой код, одновременно выполняющийся в той же задаче, будет приостановлен на время вызова block_in_place. Например, это может произойти при использовании макроса join!. Чтобы избежать этой проблемы, используйте spawn_blocking вместо block_in_place.

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

Код, выполняющийся внутри block_in_place, нельзя отменить. При завершении работы планировщика он будет ждать бесконечно, пока не завершатся все блокирующие операции. Чтобы прекратить ожидание по истечении заданного времени, можно использовать shutdown_timeout. Обратите внимание, что это всё равно не отменит задачи — им просто будет разрешено продолжить выполнение после возврата метода.

Примеры

use tokio::task;

task::block_in_place(move || {
    // do some compute-heavy work or call synchronous code
});

Код, выполняющийся внутри block_in_place, может использовать block_on для повторного входа в асинхронный контекст.

use tokio::task;
use tokio::runtime::Handle;

task::block_in_place(move || {
    Handle::current().block_on(async move {
        // do something async
    });
});

Паники

Эта функция вызывает панику, если её вызвать в среде выполнения current_thread.

MIT License
Copyright © Tokio Contributors
https://docs.rs/tokio/1.53.1/tokio/task/fn.block_in_place.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API