Асинхронното програмиране е важна концепция, която трябва да знаете като разработчик на Rust.

Традиционните модели за синхронно програмиране често водят до проблеми с производителността. Това е така, защото програмата изчаква бавните операции да завършат, преди да премине към следващата задача. Това често води до лошо използване на ресурсите и мудно потребителско изживяване.

Асинхронното програмиране ви позволява да пишете неблокиращ код, който ефективно използва системните ресурси. Като използвате асинхронно програмиране, можете да проектирате приложения, които изпълняват множество задачи. Асинхронното програмиране е удобно за обработка на няколко мрежови заявки или обработка на големи количества данни, без да блокира потока на изпълнение.

Асинхронно програмиране в Rust

Моделът за асинхронно програмиране на Rust ви позволява пишете ефективен код на Rust, който работи едновременно без да блокира потока на изпълнение. Асинхронното програмиране е полезно при работа с I/O операции, мрежови заявки и задачи, които включват изчакване на външни ресурси.

instagram viewer

Можете да внедрите асинхронно програмиране във вашите Rust приложения по няколко начина. Те включват езикови функции, библиотеки и време за изпълнение на Tokio.

Също, Моделът на собственост на Rust и примитивите за паралелност като канали и ключалки позволяват безопасно и ефективно едновременно програмиране. Можете да използвате тези функции с асинхронно програмиране, за да изградите едновременни системи, които се мащабират добре и използват множество CPU ядра.

Концепции за асинхронно програмиране на Rust

Фючърсите осигуряват основа за асинхронно програмиране в Rust. Бъдещето представлява асинхронно изчисление, което не е изпълнено напълно.

Фючърсите са мързеливи (изпълняват се само при полинг). Когато наричаш бъдеще анкета() метод, той проверява дали бъдещето е завършено или има нужда от допълнителна работа. Ако бъдещето не е готово, то се връща Анкета:: Очаква се, което показва, че задачата трябва да бъде планирана за по-късно изпълнение. Ако бъдещето е готово, то се връща Анкета:: Готов с получената стойност.

Стандартната верига от инструменти на Rust включва асинхронни I/O примитиви, асинхронна версия на файлов I/O, работа в мрежа и таймери. Тези примитиви ви позволяват да извършвате I/O операции асинхронно. Това помага да се избегне блокирането на изпълнението на програма, докато се чака изпълнението на I/O задачите.

Синтаксисът async/await ви позволява да пишете асинхронен код, който изглежда подобен на синхронния код. Това прави вашия код интуитивен и лесен за поддръжка.

Подходът на Rust към асинхронното програмиране набляга на безопасността и производителността. Правилата за собственост и заемане гарантират безопасността на паметта и предотвратяват често срещани проблеми с паралелността. Синтаксисът Async/await и фючърсите осигуряват интуитивен начин за изразяване на асинхронни работни потоци. Можете да използвате среда за изпълнение на трета страна, за да управлявате задачите за ефективно изпълнение.

Можете да комбинирате тези езикови функции, библиотеки и време за изпълнение, за да напишете високопроизводителен код. Той осигурява мощна и ергономична рамка за изграждане на асинхронни системи. Това прави Rust популярен избор за проекти, изискващи ефективно управление на I/O-обвързани задачи и висока едновременност.

Rust версия 1.39 и по-нови версии не поддържат асинхронни операции в стандартната библиотека на Rust. Ще ви е необходим сандък на трета страна, за да използвате асинхронен/изчакайте синтаксис за обработка на асинхронни операции в Rust. Можете да използвате пакети на трети страни като Токио или async-std за работа със синтаксиса async/await.

Асинхронно програмиране с Tokio

Tokio е стабилна асинхронна среда за изпълнение на Rust. Той предоставя функционалност за изграждане на високопроизводителни и мащабируеми приложения. Можете да впрегнете силата на асинхронното програмиране с Tokio. Той също така предоставя функции за разширяване.

В основата на Tokio е неговият асинхронен модел за планиране и изпълнение на задачи. Tokio ви позволява да пишете асинхронен код със синтаксиса async/await. Това позволява ефективно използване на системните ресурси и едновременно изпълнение на задачи. Цикълът за събития на Tokio ефективно управлява планирането на задачи. Това гарантира оптимално използване на процесорните ядра и минимизира разходите за превключване на контекста.

Комбинаторите на Tokio улесняват координирането и композирането на задачи. Tokio предоставя мощни инструменти за координиране на задачи и композиране. Можете да изчакате множество задачи да завършат с присъединяване, да изберете първата завършена задача с select и да се състезавате със задачи една срещу друга с надпревара.

Добавете токио щайга към вашия Cargo.toml раздел за зависимости на файла.

[dependencies]
tokio = { version = "1.9", features = ["full"] }

Ето как можете да използвате синтаксиса async/await във вашите програми на Rust с Tokio:

use tokio:: time:: sleep;
use std:: time:: Duration;

asyncfnhello_world() {
println!("Hello, ");
sleep(Duration:: from_secs(1)).await;
println!("World!");
}

#[tokio:: main]
asyncfnmain() {
hello_world().await;
}

The Здравей свят функцията е асинхронна, така че може да използва изчакайте ключова дума, за да поставите на пауза нейното изпълнение, докато бъде разрешено бъдеще. The Здравей свят функционални разпечатки "Здравейте, " към конзолата. The Продължителност:: from_secs (1) извикването на функция спира изпълнението на функцията за секунда. The изчакайте ключова дума чака завършването на бъдещето на съня. И накрая, на Здравей свят функционални разпечатки "Свят!" към конзолата.

The основен е асинхронна функция с #[tokio:: main] атрибут. Той определя основната функция като входна точка за Tokio runtime. The hello_world().чакам изпълнява функцията hello_world асинхронно.

Забавяне на задачи с Tokio

Преобладаваща задача в асинхронното програмиране е използването на забавяния или планиране на задачи за изпълнение в определен период от време. Времето за изпълнение на tokio предоставя механизъм за използване на асинхронни таймери и закъснения чрез токио:: време модул.

Ето как можете да забавите операция с Tokio runtime:

use std:: time:: Duration;
use tokio:: time:: sleep;

asyncfndelayed_operation() {
println!("Performing delayed operation...");
sleep(Duration:: from_secs(2)).await;
println!("Delayed operation completed.");
}

#[tokio:: main]
asyncfnmain() {
println!("Starting...");
delayed_operation().await;
println!("Finished.");
}

The отложена_операция въвежда закъснение от две секунди с сън метод. The отложена_операция функцията е асинхронна, така че може да използва await, за да постави на пауза изпълнението си, докато забавянето приключи.

Обработка на грешки в асинхронни програми

Обработката на грешки в асинхронния код на Rust включва използването на Резултат тип и обработка на Rust грешки с ? оператор.

use tokio:: fs:: File;
use tokio:: io;
use tokio:: io::{AsyncReadExt};

asyncfnread_file_contents() -> io::Result<String> {
letmut file = File:: open("file.txt").await?;
letmut contents = String::new();
file.read_to_string(&mut contents).await?;
Ok(contents)
}

asyncfnprocess_file() -> io::Result {
let contents = read_file_contents().await?;
// Process the file contents
Ok(())
}

#[tokio:: main]
asyncfnmain() {
match process_file().await {
Ok(()) => println!("File processed successfully."),
Err(err) => eprintln!("Error processing file: {}", err),
}
}

The четене на_съдържание_на_файл функцията връща an io:: Резултат което представлява възможността за I/O грешка. С помощта на ? оператор след всяка асинхронна операция, средата за изпълнение на Tokio ще разпространява грешките нагоре в стека на повикванията.

The основен функция обработва резултата с a съвпада оператор, който отпечатва текст въз основа на резултата от операцията.

Reqwest използва асинхронно програмиране за HTTP операции

Много популярни каси, включително Reqwest, използват Tokio за осигуряване на асинхронни HTTP операции.

Можете да използвате Tokio с Reqwest, за да направите няколко HTTP заявки, без да блокирате други задачи. Tokio може да ви помогне да управлявате хиляди едновременни връзки и ефективно да управлявате ресурси.