Asynchrónne programovanie je dôležitý koncept, ktorý si ako vývojár Rust musíte uvedomiť.

Tradičné modely synchrónneho programovania často vedú k problémom s výkonom. Je to preto, že program čaká na dokončenie pomalých operácií, kým prejde na ďalšiu úlohu. To často vedie k slabému využívaniu zdrojov a pomalému dojmu používateľa.

Asynchrónne programovanie vám umožňuje písať neblokujúci kód, ktorý efektívne využíva systémové prostriedky. Využitím asynchrónneho programovania môžete navrhovať aplikácie, ktoré vykonávajú viacero úloh. Asynchrónne programovanie je užitočné na spracovanie niekoľkých sieťových požiadaviek alebo spracovanie veľkého množstva údajov bez blokovania toku vykonávania.

Asynchrónne programovanie v Ruste

Asynchrónny programovací model Rustu vám to umožňuje písať efektívny Rust kód, ktorý beží súbežne bez blokovania toku vykonávania. Asynchrónne programovanie je výhodné pri riešení I/O operácií, sieťových požiadaviek a úloh, ktoré zahŕňajú čakanie na externé zdroje.

Asynchrónne programovanie vo svojich aplikáciách Rust môžete implementovať niekoľkými spôsobmi. Patria sem jazykové funkcie, knižnice a runtime Tokio.

instagram viewer

tiež Rustov model vlastníctva a súbežné primitívy ako kanály a zámky umožňujú bezpečné a efektívne súbežné programovanie. Tieto funkcie môžete využiť pomocou asynchrónneho programovania na vytváranie súbežných systémov, ktoré sa dobre škálujú a využívajú viaceré jadrá CPU.

Rustove koncepty asynchrónneho programovania

Futures poskytujú základ pre asynchrónne programovanie v Ruste. Budúcnosť predstavuje asynchrónny výpočet, ktorý nebol úplne vykonaný.

Futures sú lenivé (vykonajú sa len pri hlasovaní). Keď voláte budúcnosť anketa() skontroluje, či bola budúcnosť dokončená alebo či je potrebná ďalšia práca. Ak budúcnosť nie je pripravená, vráti sa Anketa:: Čaká sa, čo znamená, že úloha by mala byť naplánovaná na neskoršie vykonanie. Ak je budúcnosť pripravená, vráti sa Anketa:: Pripravené s výslednou hodnotou.

Štandardný reťazec nástrojov Rust zahŕňa asynchrónne I/O primitíva, asynchrónnu verziu súborových I/O, sieťové pripojenie a časovače. Tieto primitíva vám umožňujú vykonávať I/O operácie asynchrónne. To pomáha vyhnúť sa blokovaniu vykonávania programu počas čakania na dokončenie I/O úloh.

Syntax async/wait vám umožňuje písať asynchrónny kód, ktorý vyzerá podobne ako synchrónny kód. Vďaka tomu je váš kód intuitívny a ľahko sa udržiava.

Rustov prístup k asynchrónnemu programovaniu kladie dôraz na bezpečnosť a výkon. Pravidlá vlastníctva a výpožičiek zaisťujú bezpečnosť pamäte a zabraňujú bežným problémom so súbežnosťou. Async/wait syntax a futures poskytujú intuitívny spôsob vyjadrenia asynchrónnych pracovných tokov. Na správu úloh pre efektívne vykonávanie môžete použiť runtime tretej strany.

Tieto jazykové funkcie, knižnice a runtime môžete kombinovať a písať vysoko výkonný kód. Poskytuje výkonný a ergonomický rámec pre budovanie asynchrónnych systémov. Vďaka tomu je Rust obľúbenou voľbou pre projekty vyžadujúce efektívne spracovanie úloh viazaných na I/O a vysokú súbežnosť.

Rust verzia 1.39 a novšie vydania nepodporujú asynchrónne operácie v štandardnej knižnici Rust. Na použitie budete potrebovať prepravku tretej strany async/čakať syntax pre spracovanie asynchrónnych operácií v Rust. Môžete použiť balíky tretích strán ako napr Tokio alebo async-std pracovať so syntaxou async/wait.

Asynchrónne programovanie s Tokiom

Tokio je robustný asynchrónny runtime pre Rust. Poskytuje funkcie pre vytváranie vysoko výkonných a škálovateľných aplikácií. S Tokio môžete využiť silu asynchrónneho programovania. Poskytuje tiež funkcie pre rozšíriteľnosť.

Jadrom Tokia je jeho asynchrónny model plánovania a vykonávania úloh. Tokio vám umožňuje písať asynchrónny kód so syntaxou async/await. To umožňuje efektívne využitie systémových prostriedkov a súbežné vykonávanie úloh. Slučka udalostí v Tokiu efektívne riadi plánovanie úloh. To zaisťuje optimálne využitie jadier CPU a minimalizuje réžiu pri prepínaní kontextu.

Kombinátory Tokio uľahčujú koordináciu a kompozíciu úloh. Tokio poskytuje výkonné nástroje na koordináciu úloh a kompozíciu. Môžete čakať na splnenie viacerých úloh s pripojením, vybrať prvú dokončenú úlohu s výberom a pretekať proti sebe s rasou.

Pridajte tokio prepravka do vašej Cargo.toml sekcia závislostí súboru.

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

Tu je návod, ako môžete použiť syntax async/wait vo vašich programoch Rust s 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 ahoj_svet funkcia je asynchrónna, takže môže použiť čakať kľúčové slovo na pozastavenie jeho vykonávania, kým sa nevyrieši budúcnosť. The ahoj_svet funkcia vytlačí "Ahoj, " do konzoly. The Trvanie:: from_secs (1) volanie funkcie pozastaví vykonávanie funkcie na sekundu. The čakať kľúčové slovo čaká na dokončenie budúcnosti spánku. Nakoniec, ahoj_svet funkcia vytlačí "Svet!" do konzoly.

The Hlavná funkcia je asynchrónna funkcia s #[tokio:: main] atribút. Označuje hlavnú funkciu ako vstupný bod pre runtime Tokio. The ahoj_svet().čakaj vykonáva funkciu hello_world asynchrónne.

Odkladanie úloh s Tokiom

Prevládajúcou úlohou v asynchrónnom programovaní je použitie oneskorení alebo plánovania úloh na spustenie v určenom časovom rozsahu. Tokio runtime poskytuje mechanizmus na používanie asynchrónnych časovačov a oneskorení cez tokio:: čas modul.

Tu je návod, ako môžete oddialiť operáciu pomocou 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 oneskorená_operácia funkcia zavádza oneskorenie dvoch sekúnd s spať metóda. The oneskorená_operácia funkcia je asynchrónna, takže môže použiť wait na pozastavenie jej vykonávania, kým sa oneskorenie nedokončí.

Spracovanie chýb v asynchrónnych programoch

Spracovanie chýb v asynchrónnom kóde Rust zahŕňa použitie Výsledok typu a spracovanie chýb hrdze s ? operátor.

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 read_file_contents funkcia vracia an io:: Výsledok čo predstavuje možnosť I/O chyby. Pomocou ? po každej asynchrónnej operácii bude runtime Tokio šíriť chyby v zásobníku hovorov.

The Hlavná funkcia spracováva výsledok s a zápas vyhlásenie, ktoré vytlačí text na základe výsledku operácie.

Reqwest používa asynchrónne programovanie pre operácie HTTP

Mnoho populárnych prepraviek, vrátane Reqwest, používa Tokio na poskytovanie asynchrónnych HTTP operácií.

Môžete použiť Tokio s Reqwest na vytvorenie niekoľkých HTTP požiadaviek bez blokovania iných úloh. Tokio vám môže pomôcť zvládnuť tisíce súbežných pripojení a efektívne spravovať zdroje.