Добавить в корзинуПозвонить
Найти в Дзене
Машинное обучение

Частая дилемма в Rust: Tokio отлично подходит для async I/O, Rayon для тяжёлых CPU-задач

Но как связать их так, чтобы не заблокировать async runtime? 🦀 Команда Tantivy, поискового движка на Rust, показала, как решила это в продакшене. Проблема: Tokio-задачи не должны блокироваться. Тяжёлая CPU-работа может подвесить весь async runtime. Rayon-потоки не понимают async. Внутри rayon thread нельзя просто взять и сделать .await. Передать результат обратно между этими мирами тоже не так очевидно. Решение - мост через `oneshot`-канал. Tokio запускает задачу и ждёт результат из oneshot. Rayon выполняет CPU-работу в своём пуле потоков. Когда работа завершена, Rayon отправляет результат обратно через канал. Tokio продолжает выполнение, при этом executor всё это время не блокировался. Очень полезный паттерн для всех, кто пишет async-код на Rust. 🔗 reddit.com/r/rust/comments/1ulo7pr

Частая дилемма в Rust: Tokio отлично подходит для async I/O, Rayon для тяжёлых CPU-задач. Но как связать их так, чтобы не заблокировать async runtime? 🦀

Команда Tantivy, поискового движка на Rust, показала, как решила это в продакшене.

Проблема:

Tokio-задачи не должны блокироваться. Тяжёлая CPU-работа может подвесить весь async runtime.

Rayon-потоки не понимают async. Внутри rayon thread нельзя просто взять и сделать .await.

Передать результат обратно между этими мирами тоже не так очевидно.

Решение - мост через `oneshot`-канал.

Tokio запускает задачу и ждёт результат из oneshot.

Rayon выполняет CPU-работу в своём пуле потоков.

Когда работа завершена, Rayon отправляет результат обратно через канал.

Tokio продолжает выполнение, при этом executor всё это время не блокировался.

Очень полезный паттерн для всех, кто пишет async-код на Rust.

🔗 reddit.com/r/rust/comments/1ulo7pr