Skip to content

Instantly share code, notes, and snippets.

@mexus
Forked from polachok/faq.md
Last active September 15, 2018 22:31
Show Gist options
  • Save mexus/41d57f3d05cbc33e149f7a74e0867e29 to your computer and use it in GitHub Desktop.
Save mexus/41d57f3d05cbc33e149f7a74e0867e29 to your computer and use it in GitHub Desktop.
Futures & tokio FAQ (ru)

Что такое future?

Future это тип, для которого имплементирован трейт Future

Кто вызывает poll()?

Executor. В общем случае, это может быть ивент-луп ( цикл событий, event loop ), тред пул или что-то еще: executor.

Вы же используете tokio? Тогда, на сегодняшний день, вариантов всего два: многопоточный executor и однопоточный executor. По умолчанию (то есть если вы просто используете tokio::run и tokio::spawn используется многопоточный вариант).

Какие фьючи выбрать, есть 0.1 и 0.3?

0.3 экспериментальная версия, сейчас все используют 0.1. Принципиальных различий между ними нет.

Устал писать and_then(..).and_then(..), когда уже будет async/await?

Уже есть в nightly для futures 0.3. Но tokio пока использует futures 0.1. Есть экспериментальная поддержка

Что почитать по фьючам и tokio?

Краткое введение: https://tokio.rs/ Немного про то как работает Executor: http://rust-lang-nursery.github.io/futures-rs/blog/2018/08/17/toykio.html ...

Как работать с файлами и не блокироваться?

https://docs.rs/tokio-fs/0.1.3/tokio_fs/

К сожалению, не существует платформо-независимого способа работать с файлами в неблокирущем режиме, поэтому tokio-fs использует специальную функцию blocking (см. дальше по FAQ) для того, чтобы избежать блокировки ивент-лупа.

Как работать со стандартным вводом/выводом?

https://docs.rs/tokio/0.1.8/tokio/io/fn.stdin.html https://docs.rs/tokio/0.1.8/tokio/io/fn.stdout.html

У меня синхронный драйвер бд, что делать?

Использовать blocking.

Этот самый blocking как бы даёт подсказку tokio, что то, что вы собираетесь запустить — это всерьёз и надолго. Тут надо отметить, что стандартная практика предписывает, что метод poll (из трейта Future ) должен завершаться как можно скорее, пусть и со статусом Async::NotReady. Очевидно, ваш блокирующий вызов к базе данных может занять.. некоторое время. Именно для таких случаев и была сделана функция blocking. Когда tokio получает такую задачу, то он переносит обработку цикла событий (event loop) в другой поток, избегая, таким образом, блокировки вообще всего.

Что такое таск (task)?

Task это фьюча верхнего уровня. Т.е. то что передается в tokio::run(..) или tokio::spawn(..). Каждый spawn() создает новый таск. Таск подобен треду операционной системы, но является легковесным.

Как tokio работает с тасками?

Дефолтный рантайм tokio запускает тред пул. Таски разбирают треды из пула: work stealing.

Сделал wait() на фьюче и все зависло..?

Все верно, так и должно быть! Вы заблокировали текущий тред и теперь ивент луп не может продолжить работу. Безопасно вызывать .wait() можно только на фьючах, отправленных в тред пул.

У меня остались еще вопросы, где их можно задать?

https://t.me/tokio_rust

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment