Найти в Дзене
Ржавый код

Простой пример асинхронного программирования в Rust

В этой статье блога я буду изучать библиотеку `tokio` и приводить примеры асинхронного программирования, которые покажут вам полезность асинхронного программирования.

Допустим, мы - ресторан, и нам нужно приготовить какой-нибудь завтрак. Но для того, чтобы сделать это, мы должны предоставить меню. Наше меню будет состоять из яиц, бекона, картофельных оладий, кофе, тостов, фасоли и вафель. Давайте предположим, что на данный момент в этом ресторане работает только 1 работник и одновременно он обслуживает только 1 клиента.

Во-первых, нам нужно создать функции, которые создают эти варианты завтрака.

-2

Это два примера. Теперь давайте создадим нашего исполнителя с помощью `tokio` и запустим эти функции!

-3

Ожидаемое затраченное время выполнения должно составлять 2000 миллисекунд, однако в результате 3000 миллисекунд! Вывод в терминале демонстрирует:

-4

Эти задачи были выполнены не так, как мы ожидали, верно? Что мы хотели, так это то, что если мы запустим eggs(), то вместо ожидания мы перейдем к следующей задаче `hashbrowns()`, которая выполняется сразу же. Тут произойдет следующее: `eggs()` и `hashbrowns()` будут готовится поочереди! Однако, если мы используем `futures::join!` то это будет выполнено как мы задумали.

-5

Таким образом, наш код в итоге будет выглядеть следующим образом в потоках:

-6

`futures::join!`, по сути, “Опрашивает несколько фьючерсов одновременно, возвращая кортеж всех результатов после завершения”, эти задачи должны выполняться одновременно. Мы также можем выполнять эти задачи асинхронно, например, использовать `tokio::spawn`.

-7

Получаем результат:

-8

Обратите внимание, как это, по сути, работает за один и тот же промежуток времени одновременно и параллельно. Это сравнение инкапсулирует полезность асинхронного программирования, мы получаем точно такой же результат за один и тот же промежуток времени между 2 потоками, работающими параллельно для их соответствующих задач, и 1 потоком, работающим одновременно между 2 задачами, которые по существу ограничены вводом-выводом.

Статья на list-site.