Asinkrono programiranje je važan koncept kojeg morate biti svjesni kao Rust programer.
Tradicionalni modeli sinkronog programiranja često dovode do uskih grla u izvedbi. To je zato što program čeka da se završe spore operacije prije nego što prijeđe na sljedeći zadatak. To često rezultira slabom upotrebom resursa i usporenim korisničkim iskustvom.
Asinkrono programiranje omogućuje pisanje koda bez blokiranja koji učinkovito koristi resurse sustava. Iskorištavanjem asinkronog programiranja možete dizajnirati aplikacije koje obavljaju više zadataka. Asinkrono programiranje je zgodno za rukovanje nekoliko mrežnih zahtjeva ili obradu velikih količina podataka bez blokiranja tijeka izvršenja.
Asinkrono programiranje u Rustu
Rustov model asinkronog programiranja omogućuje vam da napisati učinkovit Rust kod koji se izvodi istovremeno bez blokiranja tijeka izvršenja. Asinkrono programiranje je korisno kada se radi o I/O operacijama, mrežnim zahtjevima i zadacima koji uključuju čekanje vanjskih resursa.
Možete implementirati asinkrono programiranje u svojim Rust aplikacijama na nekoliko načina. To uključuje jezične značajke, biblioteke i Tokio runtime.
Također, Rustov vlasnički model a primitive konkurentnosti poput kanala i brava omogućuju sigurno i učinkovito paralelno programiranje. Možete iskoristiti ove značajke s asinkronim programiranjem za izgradnju konkurentnih sustava koji se dobro skaliraju i koriste više CPU jezgri.
Rustov koncept asinkronog programiranja
Futures pruža temelj za asinkrono programiranje u Rustu. Budućnost predstavlja asinkroni proračun koji nije u potpunosti izvršen.
Fjučersi su lijeni (izvršavaju se samo kada su na glasanju). Kad zoveš budućnost anketa() metoda, provjerava je li budućnost dovršena ili je potreban dodatni rad. Ako budućnost nije spremna, vraća se Anketa:: Na čekanju, što znači da zadatak treba planirati za kasnije izvršenje. Ako je budućnost spremna, vraća se Anketa:: Spremni s rezultirajućom vrijednošću.
Rustov standardni lanac alata uključuje asinkrone I/O primitive, asinkronu verziju I/O datoteke, umrežavanje i mjerače vremena. Ove primitive vam omogućuju asinkrono izvođenje I/O operacija. Ovo pomaže u izbjegavanju blokiranja izvršavanja programa dok se čeka da se završe I/O zadaci.
Sintaksa async/await omogućuje pisanje asinkronog koda koji izgleda slično sinkronom kodu. To čini vaš kod intuitivnim i lakim za održavanje.
Rustov pristup asinkronom programiranju naglašava sigurnost i performanse. Pravila vlasništva i posuđivanja osiguravaju sigurnost memorije i sprječavaju uobičajene probleme s paralelnošću. Async/await sintaksa i futures pružaju intuitivan način izražavanja asinkronih radnih tijekova. Možete koristiti runtime treće strane za upravljanje zadacima za učinkovito izvršenje.
Možete kombinirati ove jezične značajke, biblioteke i vrijeme izvođenja kako biste napisali visokoučinkovit kod. Pruža snažan i ergonomski okvir za izgradnju asinkronih sustava. Zbog toga je Rust popularan izbor za projekte koji zahtijevaju učinkovito rukovanje I/O zadacima i visoku konkurentnost.
Rust verzija 1.39 i kasnija izdanja ne podržavaju asinkrone operacije u Rustovoj standardnoj biblioteci. Za korištenje će vam trebati sanduk treće strane asinkroni/čekati sintaksa za rukovanje asinkronim operacijama u Rustu. Možete koristiti pakete trećih strana poput Tokio ili asinkroni-std za rad sa sintaksom async/await.
Asinkrono programiranje s Tokiom
Tokio je robustan asinkroni runtime za Rust. Pruža funkcionalnost za izgradnju visokoučinkovitih i skalabilnih aplikacija. Možete iskoristiti snagu asinkronog programiranja uz Tokio. Također pruža značajke za proširivanje.
Srž Tokia je asinkroni model raspoređivanja zadataka i izvršenja. Tokio vam omogućuje pisanje asinkronog koda sa sintaksom async/await. To omogućuje učinkovito korištenje resursa sustava i istovremeno izvršavanje zadataka. Tokijska petlja događaja učinkovito upravlja raspoređivanjem zadataka. To osigurava optimalnu iskorištenost CPU jezgri i minimalizira opterećenje pri prebacivanju konteksta.
Tokijini kombinatori olakšavaju koordinaciju i sastavljanje zadataka. Tokio pruža snažne alate za koordinaciju zadataka i sastavljanje. Možete čekati da se više zadataka dovrši pomoću pridruživanja, odabrati prvi dovršeni zadatak pomoću odabira i utrkivati zadatke jedni protiv drugih pomoću utrke.
Dodajte tokio sanduk na svoj Teret.toml odjeljak ovisnosti datoteke.
[dependencies]
tokio = { version = "1.9", features = ["full"] }
Evo kako možete koristiti sintaksu async/await u svojim Rust programima s Tokiom:
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 Pozdrav svijete funkcija je asinkrona, pa može koristiti čekati ključnu riječ za pauziranje njenog izvršenja dok se budućnost ne riješi. The Pozdrav svijete funkcija ispisuje "Zdravo, " na konzolu. The Trajanje:: od_sekundi (1) poziv funkcije obustavlja izvršenje funkcije na sekundu. The čekati ključne riječi čekaju da se završi budućnost spavanja. Konačno, Pozdrav svijete funkcija ispisuje "Svijet!" na konzolu.
The glavni funkcija je asinkrona funkcija s #[tokio:: glavni] atribut. Određuje glavnu funkciju kao ulaznu točku za Tokio runtime. The hello_world().čekaj asinkrono izvršava funkciju hello_world.
Odgađanje zadataka s Tokiom
Prevladavajući zadatak u asinkronom programiranju je korištenje odgoda ili raspoređivanje zadataka za izvođenje u određenom vremenskom rasponu. Tokio runtime pruža mehanizam za korištenje asinkronih mjerača vremena i kašnjenja kroz tokio:: vrijeme modul.
Evo kako možete odgoditi operaciju s Tokio runtimeom:
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 odgođena_operacija funkcija uvodi odgodu od dvije sekunde s spavati metoda. The odgođena_operacija funkcija je asinkrona, tako da može koristiti čekanje da pauzira svoje izvršenje dok se odgoda ne završi.
Rukovanje pogreškama u asinkronim programima
Rješavanje pogrešaka u asinkronom Rust kodu uključuje korištenje Proizlaziti vrsta i rukovanje Rust pogreškama s ? operater.
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 čitanje_sadržaja_datoteke funkcija vraća an io:: Rezultat to predstavlja mogućnost I/O greške. Korištenjem ? operatora nakon svake asinkrone operacije, Tokio runtime će propagirati pogreške gore po pozivnom stogu.
The glavni funkcija obrađuje rezultat s a odgovarati naredba koja ispisuje tekst na temelju ishoda operacije.
Reqwest koristi asinkrono programiranje za HTTP operacije
Mnogi popularni sanduci, uključujući Reqwest, koriste Tokio za pružanje asinkronih HTTP operacija.
Možete koristiti Tokio s Reqwestom za postavljanje nekoliko HTTP zahtjeva bez blokiranja drugih zadataka. Tokio vam može pomoći nositi se s tisućama istodobnih veza i učinkovito upravljati resursima.