Tokio — это библиотека программного обеспечения для языка программирования Rust . Он предоставляет среду выполнения и функции, которые позволяют использовать асинхронный ввод-вывод , обеспечивая параллелизм при выполнении задач. [2] [3] [4]
Tokio был выпущен в августе 2016 года для Rust, языка программирования общего назначения . Разработанная Карлом Лершем, Tokio начиналась как платформа сетевых приложений и поддерживает такие функции, как прослушивание сокетов и широковещательная рассылка , позволяя передавать сообщения между компьютерами.
Tokio началась в августе 2016 года Карлом Лершем как инфраструктура сетевых приложений для Rust, построенная на фьючерсах , позволяющая использовать сетевое промежуточное программное обеспечение и неблокирующую , или асинхронную, реализацию готовности реактора . Tokio был вдохновлен Finagle, системой асинхронного удаленного вызова процедур (RPC) на базе Scala , разработанной в Twitter для виртуальных машин Java (JVM), позволяющей распределенным системам взаимодействовать внутри JVM. Tokio использует крейт Rust нижнего уровня , который сам использует системные вызовы, такие как epoll ( Linux ), kqueue ( FreeBSD ) и API порта завершения ввода/вывода (IOCP) ( Windows ). [5] [6] [7] Название «Токио» происходит от слов « Токио » и «мио». [8] Предварительная версия Tokio была выпущена в январе 2017 года, [9] за ней последовала полная версия в декабре 2020 года. [10] [11] В 2017 году Tokio получила грант от фонда поддержки открытого исходного кода Mozilla . [12] В апреле 2021 года Tokio профинансировала своего первого платного участника, Элис Рил, за ее работу по разработке проекта и помощи его пользователям. [13] [14]mio
Хотя Rust поддерживает асинхронные функции начиная с версии 1.39, выпущенной в ноябре 2019 года, [15] он не предоставляет никаких средств для их выполнения, и для этой цели требуется внешняя среда выполнения. [16] Tokio предоставляет среду выполнения, использующую многопоточный планировщик с перехватом работы . [10] Фьючерсы в Rust оцениваются лениво , требуя вызова функций, .await
прежде чем они выполнят какую-либо работу. [17] При .await
вызове среда выполнения Tokio может приостановить исходное будущее до завершения ввода-вывода и возобновить паузу другой задачи, готовой к дальнейшей обработке. [18]
В число пользователей Tokio входят команды разработчиков Discord и AWS Lambda . [10] Среда выполнения JavaScript и TypeScript Deno использует Tokio под капотом, в отличие от среды выполнения JavaScript Node.js , которая использует библиотеку libuv . [19]
Tokio позволяет использовать асинхронные функции в Rust посредством создания асинхронной среды выполнения. Это можно сделать с помощью #[tokio::main]
макроса . [18]
Например:
#[tokio::main] async fn main () -> Result < () > { let url = "https://en.wikipedia.org/" ; let text = reqwest :: get ( url ). Ждите ? . текст (). Ждите ? ; распечататьлн! ( "{}" , текст ); Хорошо (()) }
В этом примере reqwest
контейнер используется для запроса языка гипертекстовой разметки (HTML) для английской Википедии . Чтобы гарантировать, что запрос не будет обработан немедленно, Tokio помещает вызов функции в асинхронную среду выполнения, ожидая завершения запроса перед вызовом println()
.
Tokio также включает версию стандартной библиотеки Rust, предназначенную для асинхронного использования. Например, tokio::fs::read_to_end()
, считывающий содержимое файла, является асинхронной версией std::fs::read_to_end()
. [20] Кроме того, Tokio поддерживает io_uring , интерфейс системных вызовов асинхронного ввода-вывода Linux, в отдельном контейнере с именем tokio-uring
. [10] [21]
Tokio также позволяет пользователям создавать задачи ( зеленые потоки ) с помощью tokio::spawn()
функции. Зеленые потоки выполняются на уровне пользователя, обеспечивая параллелизм, когда собственные потоки не всегда доступны. [22] В предыдущих версиях Rust реализована зеленая многопоточность; эта функциональность была удалена в Rust 1.0. [23] В отличие от фьючерсов, задачам не нужно использовать .await
, поскольку задача будет автоматически выполняться, когда поток доступен. [18]
Tokio способна прослушивать сокеты с помощью неблокирующего подхода. [5] В частности, TcpListener
структура привязывает прослушиватель сокета TCP к адресу и асинхронно выполняет функцию. [24]
Tokio предоставляет тип широковещательного канала, позволяющий транслировать сообщения нескольким получателям. После отправки сообщения оно принимается такими получателями. Это обеспечивает связь в реальном времени и распределенные системы, среди других приложений. [25]
{{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка ){{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка ){{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка ){{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка ){{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка )