Asinchroninis programavimas yra svarbi sąvoka, kurią turite žinoti kaip Rust kūrėjas.
Tradiciniai sinchroninio programavimo modeliai dažnai sukelia našumo kliūtis. Taip yra todėl, kad programa laukia, kol bus baigtos lėtos operacijos, prieš pereidama prie kitos užduoties. Tai dažnai lemia prastą išteklių naudojimą ir vangią vartotojo patirtį.
Asinchroninis programavimas leidžia rašyti neblokuojantį kodą, kuris efektyviai naudoja sistemos išteklius. Naudodami asinchroninį programavimą galite kurti programas, kurios atlieka kelias užduotis. Asinchroninis programavimas yra patogus norint apdoroti keletą tinklo užklausų arba apdoroti didelius duomenų kiekius neužblokuojant vykdymo srauto.
Asinchroninis programavimas rūdyje
Rust asinchroninio programavimo modelis leidžia parašyti efektyvų Rust kodą, kuris veikia vienu metu neblokuojant vykdymo srauto. Asinchroninis programavimas yra naudingas atliekant įvesties / išvesties operacijas, tinklo užklausas ir užduotis, susijusias su išorinių išteklių laukimu.
Asinchroninį programavimą „Rust“ programose galite įdiegti keliais būdais. Tai apima kalbos funkcijas, bibliotekas ir Tokio vykdymo laiką.
Taip pat Rusto nuosavybės modelis o lygiagretumo primityvai, tokie kaip kanalai ir užraktai, leidžia saugiai ir efektyviai programuoti vienu metu. Šias funkcijas galite panaudoti naudodami asinchroninį programavimą, kad sukurtumėte lygiagrečias sistemas, kurios gerai keičiasi ir naudoja kelis procesoriaus branduolius.
Rusto asinchroninio programavimo koncepcijos
Ateities sandoriai suteikia pagrindą asinchroniniam programavimui Rust. Ateitis reiškia asinchroninį skaičiavimą, kuris nebuvo visiškai atliktas.
Ateities sandoriai yra tingūs (jie vykdomi tik apklausos metu). Kai vadini ateitimi apklausa () metodu, patikrinama, ar ateitis baigta, ar reikia papildomo darbo. Jei ateitis nėra paruošta, ji grįžta Apklausa:: Laukiama, nurodant, kad užduotis turėtų būti suplanuota vėlesniam vykdymui. Jei ateitis paruošta, ji grįžta Apklausa:: Pasiruošę su gauta verte.
Standartinė „Rust“ įrankių grandinė apima asinchroninius įvesties / išvesties pradmenis, asinchroninę failų įvesties / išvesties versiją, tinklą ir laikmačius. Šie primityvai leidžia atlikti įvesties/išvesties operacijas asinchroniškai. Tai padeda išvengti programos vykdymo blokavimo laukiant, kol bus baigtos įvesties / išvesties užduotys.
Asinchroninio / laukimo sintaksė leidžia rašyti asinchroninį kodą, kuris atrodo panašus į sinchroninį kodą. Dėl to jūsų kodas yra intuityvus ir lengvai prižiūrimas.
Rust požiūris į asinchroninį programavimą pabrėžia saugumą ir našumą. Nuosavybės ir skolinimosi taisyklės užtikrina atminties saugumą ir užkerta kelią įprastoms lygiagrečioms problemoms. Asinchroninė / laukimo sintaksė ir ateities sandoriai yra intuityvus būdas išreikšti asinchronines darbo eigas. Norėdami efektyviai vykdyti užduotis, galite naudoti trečiosios šalies vykdymo laiką.
Galite sujungti šias kalbos funkcijas, bibliotekas ir vykdymo laiką, kad galėtumėte parašyti labai našų kodą. Tai suteikia galingą ir ergonomišką sistemą asinchroninėms sistemoms kurti. Dėl to Rust yra populiarus pasirinkimas projektams, kuriems reikalingas efektyvus įvesties / išvesties užduočių tvarkymas ir didelis lygiagretumas.
Rust 1.39 ir vėlesnės versijos nepalaiko asinchroninių operacijų standartinėje Rust bibliotekoje. Norėdami naudoti, jums reikės trečiosios šalies dėžutės async/laukti sintaksė, skirta asinchroninėms operacijoms tvarkyti Rust. Galite naudoti trečiųjų šalių paketus, pvz Tokio arba async-std dirbti su async/wait sintaksė.
Asinchroninis programavimas su Tokiju
Tokio yra tvirtas asinchroninis Rust veikimo laikas. Tai suteikia funkcionalumą kuriant didelio našumo ir keičiamo dydžio programas. Su Tokiju galite panaudoti asinchroninio programavimo galią. Jame taip pat yra išplėtimo funkcijų.
Tokio esmė yra asinchroninis užduočių planavimo ir vykdymo modelis. Tokio leidžia rašyti asinchroninį kodą naudojant async/wait sintaksę. Tai leidžia efektyviai panaudoti sistemos išteklius ir vienu metu vykdyti užduotis. Tokio renginių ciklas efektyviai valdo užduočių planavimą. Tai užtikrina optimalų procesoriaus branduolių panaudojimą ir sumažina konteksto perjungimo išlaidas.
Tokio kombinatoriai palengvina užduočių koordinavimą ir komponavimą. Tokio siūlo galingus užduočių koordinavimo ir komponavimo įrankius. Prisijungdami galite palaukti, kol bus įvykdytos kelios užduotys, pasirinkti pirmą atliktą užduotį ir lenktyniauti tarpusavyje su lenktynėmis.
Pridėkite tokio dėžė prie tavo Krovinys.toml failo priklausomybių skyrių.
[dependencies]
tokio = { version = "1.9", features = ["full"] }
Štai kaip galite naudoti asinchronizavimo / laukimo sintaksę savo Rust programose su 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 Labas pasauli funkcija yra asinchroninė, todėl ji gali naudoti laukti raktinį žodį, kad pristabdytų jo vykdymą, kol bus išspręsta ateitis. The Labas pasauli funkcija spausdina "Sveiki, " prie konsolės. The Trukmė:: nuo_sek. (1) funkcijos iškvietimas sustabdo funkcijos vykdymą sekundei. The laukti raktinis žodis laukia, kol baigsis miego ateitis. Galiausiai, Labas pasauli funkcija spausdina "Pasaulis!" prie konsolės.
The pagrindinis funkcija yra asinchroninė funkcija su #[tokio:: pagrindinis] atributas. Jis nurodo pagrindinę funkciją kaip Tokio vykdymo laiko įėjimo tašką. The hello_world().laukti asinchroniškai vykdo funkciją hello_world.
Užduočių atidėliojimas su Tokiju
Dažniausia asinchroninio programavimo užduotis yra uždelsimas arba užduočių planavimas, kad jie būtų vykdomi tam tikru laiko intervalu. Tokio vykdymo laikas suteikia asinchroninių laikmačių ir vėlavimų naudojimo mechanizmą tokio:: laikas modulis.
Štai kaip galite atidėti operaciją su Tokio vykdymo laiku:
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 uždelsta_operacija funkcija įveda dviejų sekundžių delsą su miegoti metodas. The uždelsta_operacija funkcija yra asinchroninė, todėl ji gali naudoti laukimą, kad pristabdytų jos vykdymą, kol uždelsimas bus baigtas.
Klaidų tvarkymas asinchroninėse programose
Asinchroninio Rust kodo klaidų apdorojimas apima naudojimą Rezultatas tipas ir rūdžių klaidų tvarkymas su ? operatorius.
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 skaityti_failo_turinys funkcija grąžina an io:: Rezultatas tai reiškia įvesties / išvesties klaidos galimybę. Naudodami ? operatorius po kiekvienos asinchroninės operacijos, Tokio vykdymo laikas perkels klaidas į skambučių krūvą.
The pagrindinis funkcija apdoroja rezultatą su a rungtynės pareiškimas, kuris atspausdina tekstą pagal operacijos rezultatą.
„Reqwest“ HTTP operacijoms naudoja asinchroninį programavimą
Daugelis populiarių dėžių, įskaitant Reqwest, naudoja Tokią asinchroninėms HTTP operacijoms teikti.
Galite naudoti Tokio su Reqwest, kad pateiktumėte keletą HTTP užklausų, neblokuodami kitų užduočių. Tokio gali padėti jums valdyti tūkstančius lygiagrečių ryšių ir efektyviai valdyti išteklius.