Asinhrono programiranje je pomemben koncept, ki se ga morate zavedati kot razvijalec Rust.

Tradicionalni modeli sinhronega programiranja pogosto povzročijo ozka grla v delovanju. To je zato, ker program čaka na dokončanje počasnih operacij, preden nadaljuje z naslednjo nalogo. Posledica tega je pogosto slaba uporaba virov in počasna uporabniška izkušnja.

Asinhrono programiranje vam omogoča pisanje kode brez blokiranja, ki učinkovito uporablja sistemske vire. Z uporabo asinhronega programiranja lahko oblikujete aplikacije, ki izvajajo več nalog. Asinhrono programiranje je priročno za obravnavanje več omrežnih zahtev ali obdelavo velikih količin podatkov, ne da bi blokirali tok izvajanja.

Asinhrono programiranje v Rustu

Rustov model asinhronega programiranja vam omogoča pisanje učinkovite kode Rust, ki se izvaja sočasno brez blokiranja toka izvajanja. Asinhrono programiranje je koristno pri delu z V/I operacijami, omrežnimi zahtevami in opravili, ki vključujejo čakanje na zunanje vire.

Asinhrono programiranje v svojih aplikacijah Rust lahko implementirate na več načinov. Ti vključujejo jezikovne funkcije, knjižnice in izvajalno okolje Tokio.

instagram viewer

tudi Lastniški model Rusta in primitivi za sočasnost, kot so kanali in ključavnice, omogočajo varno in učinkovito sočasno programiranje. Te funkcije lahko izkoristite z asinhronim programiranjem za izgradnjo sočasnih sistemov, ki se dobro prilagajajo in uporabljajo več jeder CPE.

Koncepti Rustovega asinhronega programiranja

Futures zagotavlja osnovo za asinhrono programiranje v Rustu. Prihodnost predstavlja asinhroni izračun, ki še ni bil v celoti izveden.

Prihodnje pogodbe so lene (izvedejo se samo ob glasovanju). Ko kličeš prihodnost anketa() metoda preverja, ali je prihodnost dokončana ali potrebuje dodatno delo. Če prihodnost ni pripravljena, se vrne Anketa:: V teku, kar pomeni, da je treba nalogo načrtovati za kasnejšo izvedbo. Če je prihodnost pripravljena, se vrne Anketa:: Pripravljen z dobljeno vrednostjo.

Standardna veriga orodij Rust vključuje asinhrone V/I primitive, asinhrono različico datotečnega V/I, mreženje in časovnike. Ti primitivi vam omogočajo asinhrono izvajanje V/I operacij. To pomaga preprečiti blokiranje izvajanja programa med čakanjem na dokončanje V/I nalog.

Sintaksa async/await vam omogoča pisanje asinhrone kode, ki je podobna sinhroni kodi. Zaradi tega je vaša koda intuitivna in enostavna za vzdrževanje.

Rustov pristop k asinhronemu programiranju poudarja varnost in zmogljivost. Pravila lastništva in izposoje zagotavljajo varnost pomnilnika in preprečujejo pogoste težave s sočasnostjo. Sintaksa async/await in terminske pogodbe zagotavljajo intuitiven način za izražanje asinhronih delovnih tokov. Za upravljanje nalog za učinkovito izvajanje lahko uporabite izvajalno okolje tretje osebe.

Te jezikovne funkcije, knjižnice in izvajalno okolje lahko kombinirate, da napišete visoko zmogljivo kodo. Zagotavlja močan in ergonomski okvir za gradnjo asinhronih sistemov. Zaradi tega je Rust priljubljena izbira za projekte, ki zahtevajo učinkovito obravnavanje nalog, vezanih na V/I, in visoko sočasnost.

Rust različica 1.39 in novejše izdaje ne podpirajo asinhronih operacij v standardni knjižnici Rust. Za uporabo boste potrebovali zaboj tretje osebe asinh/čakati sintaksa za ravnanje z asinhronimi operacijami v Rust. Uporabite lahko pakete tretjih oseb, kot je Tokio oz async-std za delo s sintakso async/await.

Asinhrono programiranje s Tokiom

Tokio je robustno asinhrono izvajalno okolje za Rust. Zagotavlja funkcionalnost za izdelavo visoko zmogljivih in razširljivih aplikacij. S Tokiom lahko izkoristite moč asinhronega programiranja. Zagotavlja tudi funkcije za razširljivost.

Jedro Tokia je njegov asinhroni model načrtovanja in izvajanja nalog. Tokio vam omogoča pisanje asinhrone kode s sintakso async/await. To omogoča učinkovito uporabo sistemskih virov in sočasno izvajanje nalog. Tokiova zanka dogodkov učinkovito upravlja razporejanje opravil. To zagotavlja optimalno izkoriščenost jeder CPE in zmanjšuje stroške preklapljanja konteksta.

Tokiovi kombinatorji olajšajo usklajevanje in sestavljanje nalog. Tokio ponuja zmogljiva orodja za usklajevanje nalog in sestavljanje. Z pridružitvijo lahko počakate, da se dokonča več nalog, izberete prvo dokončano nalogo z izbiro in med nalogami tekmujete z dirko.

Dodajte tokio zaboj za vašo Cargo.toml razdelek odvisnosti datoteke.

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

Tukaj je opisano, kako lahko uporabite sintakso async/await v svojih programih Rust 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 Pozdravljen, svet funkcija je asinhrona, zato lahko uporablja čakati ključno besedo za začasno ustavitev njenega izvajanja, dokler prihodnost ni razrešena. The Pozdravljen, svet funkcijski natisi "Zdravo, " na konzolo. The Trajanje:: od_sekund (1) klic funkcije prekine izvajanje funkcije za sekundo. The čakati ključne besede čakajo na dokončanje prihodnosti spanja. Končno, Pozdravljen, svet funkcijski natisi "Svet!" na konzolo.

The glavni funkcija je asinhrona funkcija z #[tokio:: main] atribut. Glavno funkcijo označuje kot vstopno točko za izvajalno okolje Tokio. The hello_world().čakajte asinhrono izvede funkcijo hello_world.

Odlaganje opravil s Tokiom

Prevladujoča naloga v asinhronem programiranju je uporaba zakasnitev ali razporejanje nalog za izvajanje v določenem časovnem obdobju. Tokio runtime ponuja mehanizem za uporabo asinhronih časovnikov in zakasnitev prek tokio:: čas modul.

Tukaj je opisano, kako lahko odložite operacijo z izvajalnim okoljem Tokio:

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 odloženo_delovanje funkcija uvede zamik dveh sekund z spati metoda. The odloženo_delovanje funkcija je asinhrona, zato lahko uporabi await za premor pri izvajanju, dokler se zakasnitev ne konča.

Obravnava napak v asinhronih programih

Obravnava napak v asinhroni kodi Rust vključuje uporabo Rezultat tip in obravnavanje napak Rust z ? 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 branje_vsebine_datoteke funkcija vrne an io:: Rezultat ki predstavlja možnost V/I napake. Z uporabo ? operaterja po vsaki asinhroni operaciji bo izvajalno okolje Tokio posredovalo napake navzgor po klicnem skladu.

The glavni funkcija obravnava rezultat z a tekma stavek, ki izpiše besedilo glede na rezultat operacije.

Reqwest uporablja asinhrono programiranje za operacije HTTP

Veliko priljubljenih zabojev, vključno z Reqwestom, uporablja Tokio za zagotavljanje asinhronih operacij HTTP.

Tokio lahko uporabite z Reqwestom za izdelavo več zahtev HTTP, ne da bi blokirali druga opravila. Tokio vam lahko pomaga upravljati na tisoče sočasnih povezav in učinkovito upravljati vire.