Учебник Tokio
Учебное руководство
Tokio — это асинхронная среда выполнения (runtime) для языка программирования Rust. Она предоставляет строительные блоки, необходимые для написания сетевых приложений. Tokio дает гибкость для работы с широким спектром систем — от больших серверов с десятками ядер до небольших встраиваемых устройств.
На высоком уровне Tokio предоставляет несколько основных компонентов:
- Многопоточную среду выполнения для исполнения асинхронного кода
- Асинхронную версию стандартной библиотеки
- Большую экосистему библиотек
Роль Tokio в вашем проекте
Когда вы пишете приложение в асинхронном стиле, вы позволяете ему лучше масштабироваться за счет снижения стоимости одновременного выполнения множества операций. Однако асинхронный код Rust не работает сам по себе, поэтому вам необходимо выбрать среду выполнения. Библиотека Tokio является наиболее широко используемой средой выполнения, превосходящей по использованию все остальные среды вместе взятые.
Кроме того, Tokio предоставляет множество полезных утилит. При написании асинхронного кода вы не можете использовать обычные блокирующие API, предоставляемые стандартной библиотекой Rust, и вместо этого должны использовать их асинхронные версии. Эти альтернативные версии предоставляются Tokio и повторяют API стандартной библиотеки Rust там, где это имеет смысл.
Преимущества Tokio
В этом разделе описаны некоторые преимущества Tokio.
Быстродействие Tokio — быстрый, построенный на основе языка программирования Rust, который сам по себе быстрый. Это сделано в духе Rust с целью, чтобы вы не могли улучшить производительность, написав эквивалентный код вручную.
Tokio — масштабируемый, построенный на основе функциональности языка async/await, которая сама по себе масштабируема. При работе с сетевыми соединениями существует предел скорости обработки одного соединения из-за задержек, поэтому единственный способ масштабирования — одновременная обработка множества соединений. С функцией языка async/await увеличение количества concurrent-операций становится incredibly дешевым, позволяя масштабироваться до большого количества одновременных задач.
Надежность Tokio построен с использованием Rust — языка, который позволяет каждому создавать надежное и эффективное программное обеспечение. Ряд исследований показал, что примерно ~70% критических уязвимостей безопасности являются результатом небезопасной работы с памятью. Использование Rust устраняет весь этот класс ошибок в ваших приложениях.
Tokio также уделяет большое внимание обеспечению последовательного поведения без сюрпризов. Основная цель Tokio — позволить пользователям развертывать предсказуемое программное обеспечение, которое будет работать одинаково изо дня в день с надежным временем отклика и без непредсказуемых скачков задержки.
Простота С функцией async/await в Rust сложность написания асинхронных приложений существенно снизилась. В сочетании с утилитами Tokio и vibrant экосистемой написание приложений становится легким.
Tokio следует соглашениям об именовании стандартной библиотеки, где это имеет смысл. Это позволяет легко преобразовывать код, написанный только со стандартной библиотекой, в код, написанный с Tokio. С сильной системой типов Rust возможность легко создавать корректный код не имеет аналогов.
Гибкость Tokio предоставляет несколько вариантов среды выполнения — от многопоточной среды с work-stealing до легковесной однопоточной среды. Каждая из этих сред выполнения поставляется с множеством настроек, позволяющих пользователям адаптировать их к своим потребностям.
Когда не следует использовать Tokio
Хотя Tokio полезен для многих проектов, которым необходимо выполнять множество операций одновременно, есть также случаи, когда Tokio не подходит.
- Ускорение вычислений, ограниченных производительностью CPU, путем их параллельного выполнения в нескольких потоках. Tokio разработан для приложений, ограниченных производительностью I/O, где каждая отдельная задача тратит большую часть времени на ожидание I/O. Если ваше приложение только выполняет параллельные вычисления, вам следует использовать rayon. Тем не менее, все еще возможно "смешивать и сочетать", если вам нужно делать и то, и другое.
- Чтение большого количества файлов. Хотя может показаться, что Tokio будет полезен для проектов, которым просто нужно читать много файлов, Tokio не дает здесь преимуществ по сравнению с обычным пулом потоков. Это связано с тем, что операционные системы обычно не предоставляют асинхронные API для работы с файлами.
- Отправка одного веб-запроса. Tokio дает преимущество, когда вам нужно делать много вещей одновременно. Если вам нужно использовать библиотеку, предназначенную для асинхронного Rust, такую как reqwest, но вам не нужно делать много операций одновременно, вам следует предпочесть блокирующую версию этой библиотеки, так как это упростит ваш проект. Использование Tokio, конечно, все равно будет работать, но не даст реальных преимуществ по сравнению с блокирующим API.
Получение помощи
В любой момент, если вы застряли, вы всегда можете получить помощь в Discord или обсуждениях на GitHub. Не беспокойтесь о задавании "начальных" вопросов. Мы все с чего-то начинали и рады помочь.