Комментарии 4
В комментах ещё вариант подкинули с микроскопической библиотекой - https://docs.rs/crate/bisync/0.2.2 .
ввод/вывод, поэтому применять здесь async действительно целесообразно
(кстати, это одна из тех фишек, благодаря которым сегодня так
востребован Rust)
В оригинале было (that, and because it’s what the cool kids use in Rust nowadays). Смысл немного другой.
Я несколько иначе действую и еще ни разу не столкнулся с проблемами и сложностью поддержки:
реализую обычную синхронную блокирующую реализацию;
реализую синхронную неблокирующую реализацию с рантаймом, требуемым по месту (например, выделенным потоком, mpsc);
реализую асинхронный код на базе неблокирующей реализации, что тривиально, когда общение с синхронным кодом происходит через mpsc.
Бывает наоборот:
асинхронная реализация (если нижележащие компоненты хотят такую реализацию);
блокирующая;
неблокирующая.
Экспортирую как:
crate::blocking::
crate::nonblocking::
crate::async
Бойлерплейта не то чтобы уж сильно много.
Покажите примеры? У меня в quick_xml тоже есть синхронный и асинхронный интерфейсы, в свое время не нашел ничего лучше, чем сделать макрос, подставляющий в нужные места async
и await
, а также некоторые методы. Рабочее решение, без зависимостей, но немного не нравится тем, что внутри макроса подсказки IDE нормально не работают. maybe_async
отпал по причинам, описанным в статье -- он позволяет в единый момент времени раскрытие только во что-то одно.
Жизнь – боль: как одновременно поддерживать в Rust синхронный и асинхронный код