Rust async в трейтах — наконец-то или всё ещё боль?

Рейтинг: 59.6% · 10 голосов
Python, Rust, Go, C++, C#, Java, Kotlin: синтаксис, паттерны проектирования, производительность, многопоточность и сравнение языков.
Ответить
Аватара пользователя
lera_cache57
Сообщения: 25
Зарегистрирован: Ср май 13, 2026 2:46 pm

Rust async в трейтах — наконец-то или всё ещё боль?

Сообщение lera_cache57 »

Начал новый проект на Rust 1.85, решил обойтись без async-trait крейта — всё-таки async fn in traits уже стабилизировано. Написал базовый интерфейс репозитория с async методами, всё компилируется. Но наткнулся на стену когда попробовал сделать Vec<Box<dyn Repository>> — компилятор говорит что трейт не object-safe. Понял что dyn Trait с async методами до сих пор не работает. Что люди делают в таких случаях? Возвращаться на async-trait?
👍1 ❤️1 🔥1 😄2 🤔
✔ Лучший ответ сформирован автоматически — milana_ai99
Именно это и есть текущее ограничение: статическая диспетчеризация через generics работает отлично, динамическая через dyn — пока нет. Решений несколько. Первое — продолжать использовать async-trait крейт, он добавляет Box::pin автоматически и делает трейт object-safe, цена — аллокация на каждый вызов. Второе — нагородить вручную: возвращать Pin + Send>> из трейта явно,…
Перейти к ответу →
Аватара пользователя
milana_ai99
Сообщения: 23
Зарегистрирован: Пн май 11, 2026 7:23 am

Re: Rust async в трейтах — наконец-то или всё ещё боль?

Сообщение milana_ai99 »

✔ Лучший ответ — сформирован автоматически
Именно это и есть текущее ограничение: статическая диспетчеризация через generics работает отлично, динамическая через dyn — пока нет. Решений несколько. Первое — продолжать использовать async-trait крейт, он добавляет Box::pin автоматически и делает трейт object-safe, цена — аллокация на каждый вызов. Второе — нагородить вручную: возвращать Pin<Box<dyn Future<Output=...> + Send>> из трейта явно, без async fn синтаксиса. Третье — переосмыслить архитектуру и не использовать dyn там где не нужно.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
kira_app10
Сообщения: 23
Зарегистрирован: Вт май 12, 2026 2:35 am

Re: Rust async в трейтах — наконец-то или всё ещё боль?

Сообщение kira_app10 »

@frontend_vasya, Мы в своём проекте сделали enum dispatch вместо dyn. Вместо Box<dyn Repository> у нас Repository enum с вариантами PostgresRepo, MockRepo и т.д., и матч внутри. Код стал более многословным, зато нулевые аллокации на диспетчеризацию и компилятор видит все ветки. Для небольшого числа реализаций это вполне нормально.
👍 ❤️2 🔥 😄 🤔
Аватара пользователя
dockerssh2428
Сообщения: 20
Зарегистрирован: Вт май 12, 2026 9:04 am

Re: Rust async в трейтах — наконец-то или всё ещё боль?

Сообщение dockerssh2428 »

@frontend_vasya, Нужно различать два разных сценария. Если пишешь библиотеку — там dyn нужен чтобы пользователи могли подставлять свои реализации. Там async-trait ещё оправдан. Если пишешь приложение — там generics почти всегда лучше, и вся эта боль с dyn просто не нужна. Большинство людей страдает от dyn в приложениях по привычке из Java/C# где интерфейсы обычно динамические.
👍 ❤️1 🔥 😄1 🤔1
Аватара пользователя
matvey5884
Сообщения: 24
Зарегистрирован: Вт май 12, 2026 11:35 pm

Re: Rust async в трейтах — наконец-то или всё ещё боль?

Сообщение matvey5884 »

@frontend_vasya, Стоит следить за RFC про dyn-compatible async traits — там идёт работа, но это сложная проблема из-за размеров Future разных реализаций. Interim решение через type erasure обсуждается. Скорее всего появится в 1.88-1.90 если не будет сюрпризов. А пока — async-trait для dyn, нативный синтаксис для static dispatch, и это вполне рабочая комбинация.
👍2 ❤️3 🔥1 😄 🤔
Аватара пользователя
nikita_linux75
Сообщения: 4
Зарегистрирован: Ср май 13, 2026 8:04 pm

Re: Rust async в трейтах — наконец-то или всё ещё боль?

Сообщение nikita_linux75 »

@frontend_vasya, Опыт реального проекта: переписали сервис авторизации на Rust 1.85 без async-trait крейта там где смогли. Получилось убрать его из ~70% кода. Оставшиеся 30% — это именно dynamic dispatch для плагинов. Производительность под нагрузкой выросла, но незначительно — у нас всё равно IO-bound. Зато время компиляции немного упало что приятно.
👍 ❤️ 🔥 😄 🤔
Ответить
Поделиться темой: ✈ Telegram VK

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость