Как стать автором
Обновить

Комментарии 4

В комментах ещё вариант подкинули с микроскопической библиотекой - https://docs.rs/crate/bisync/0.2.2 .

ввод/вывод, поэтому применять здесь async действительно целесообразно
(кстати, это одна из тех фишек, благодаря которым сегодня так
востребован Rust)

В оригинале было (that, and because it’s what the cool kids use in Rust nowadays). Смысл немного другой.

Я несколько иначе действую и еще ни разу не столкнулся с проблемами и сложностью поддержки:

  1. реализую обычную синхронную блокирующую реализацию;

  2. реализую синхронную неблокирующую реализацию с рантаймом, требуемым по месту (например, выделенным потоком, mpsc);

  3. реализую асинхронный код на базе неблокирующей реализации, что тривиально, когда общение с синхронным кодом происходит через mpsc.

Бывает наоборот:

  1. асинхронная реализация (если нижележащие компоненты хотят такую реализацию);

  2. блокирующая;

  3. неблокирующая.

Экспортирую как:

  • crate::blocking::

  • crate::nonblocking::

  • crate::async

Бойлерплейта не то чтобы уж сильно много.

Покажите примеры? У меня в quick_xml тоже есть синхронный и асинхронный интерфейсы, в свое время не нашел ничего лучше, чем сделать макрос, подставляющий в нужные места async и await, а также некоторые методы. Рабочее решение, без зависимостей, но немного не нравится тем, что внутри макроса подсказки IDE нормально не работают. maybe_async отпал по причинам, описанным в статье -- он позволяет в единый момент времени раскрытие только во что-то одно.

Вот тут есть пример блокирующей и неблокирующей реализации, async поверх неблокирующей в этом публичном репе нет, но он тривиально делается на неблокирующей версии:

https://github.com/insight-platform/RocksQ

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации