Programarea asincronă este un concept important de care trebuie să fii conștient în calitate de dezvoltator Rust.

Modelele tradiționale de programare sincronă duc adesea la blocaje de performanță. Acest lucru se datorează faptului că programul așteaptă finalizarea operațiunilor lente înainte de a trece la următoarea sarcină. Acest lucru duce adesea la o utilizare slabă a resurselor și la o experiență de utilizator lentă.

Programarea asincronă vă permite să scrieți cod neblocant care utilizează eficient resursele sistemului. Folosind programarea asincronă, puteți proiecta aplicații care îndeplinesc mai multe sarcini. Programarea asincronă este utilă pentru gestionarea mai multor solicitări de rețea sau procesarea unor cantități mari de date fără a bloca fluxul de execuție.

Programare asincronă în Rust

Modelul de programare asincronă al lui Rust vă permite scrie cod Rust eficient care rulează concomitent fără a bloca fluxul de execuție. Programarea asincronă este benefică atunci când se ocupă cu operațiuni I/O, solicitări de rețea și sarcini care implică așteptarea resurselor externe.

instagram viewer

Puteți implementa programarea asincronă în aplicațiile dvs. Rust în mai multe moduri. Acestea includ caracteristici de limbă, biblioteci și timpul de execuție Tokio.

De asemenea, Modelul de proprietate al lui Rust iar primitivele de concurență, cum ar fi canalele și încuietorile, permit programarea simultană sigură și eficientă. Puteți utiliza aceste funcții cu programare asincronă pentru a construi sisteme concurente care să se scaleze bine și să utilizeze mai multe nuclee CPU.

Conceptele de programare asincronă a lui Rust

Futures oferă o bază pentru programarea asincronă în Rust. Un viitor reprezintă un calcul asincron care nu a fost complet executat.

Futurile sunt leneșe (sunt executate doar atunci când sunt la sondaj). Când suni un viitor sondaj() metoda, verifică dacă viitorul a fost finalizat sau necesită lucrări suplimentare. Dacă viitorul nu este pregătit, se întoarce Sondaj:: În așteptare, indicând că sarcina ar trebui programată pentru execuție ulterioară. Dacă viitorul este gata, se întoarce Sondaj:: Gata cu valoarea rezultată.

Lanțul de instrumente standard al Rust include primitive I/O asincrone, o versiune asincronă a I/O fișierelor, rețele și temporizatoare. Aceste primitive vă permit să efectuați operațiuni I/O asincron. Acest lucru ajută la evitarea blocării execuției unui program în timp ce așteptați finalizarea sarcinilor I/O.

Sintaxa async/wait vă permite să scrieți cod asincron care arată similar cu codul sincron. Acest lucru face codul dvs. intuitiv și ușor de întreținut.

Abordarea Rust asupra programarii asincrone pune accent pe siguranta si performanta. Regulile de proprietate și de împrumut asigură siguranța memoriei și previn problemele comune de concurență. Sintaxa async/wait și futures oferă o modalitate intuitivă de a exprima fluxurile de lucru asincrone. Puteți utiliza un runtime terță parte pentru a gestiona sarcinile pentru o execuție eficientă.

Puteți combina aceste caracteristici de limbaj, biblioteci și runtime pentru a scrie cod de înaltă performanță. Oferă un cadru puternic și ergonomic pentru construirea de sisteme asincrone. Acest lucru face din Rust o alegere populară pentru proiectele care necesită o gestionare eficientă a sarcinilor legate de I/O și concurență ridicată.

Rust versiunea 1.39 și versiunile ulterioare nu acceptă operațiuni asincrone în biblioteca standard a Rust. Veți avea nevoie de o cutie terță parte pentru a utiliza asincron/asteapta sintaxă pentru gestionarea operațiilor asincrone în Rust. Puteți utiliza pachete terțe, cum ar fi Tokio sau async-std pentru a lucra cu sintaxa async/wait.

Programare asincronă cu Tokio

Tokio este un timp de rulare asincron robust pentru Rust. Oferă funcționalitate pentru construirea de aplicații de înaltă performanță și scalabile. Puteți valorifica puterea programării asincrone cu Tokio. De asemenea, oferă caracteristici pentru extensibilitate.

La baza Tokio se află modelul său asincron de planificare și execuție a sarcinilor. Tokio vă permite să scrieți cod asincron cu sintaxa async/wait. Acest lucru permite utilizarea eficientă a resurselor sistemului și executarea concomitentă a sarcinilor. Bucla de evenimente Tokio gestionează eficient programarea sarcinilor. Acest lucru asigură utilizarea optimă a nucleelor ​​CPU și minimizează suprasarcina de schimbare a contextului.

Combinatoarele Tokio facilitează coordonarea și compunerea sarcinilor. Tokio oferă instrumente puternice de coordonare și compunere a sarcinilor. Puteți aștepta ca mai multe sarcini să fie finalizate cu alăturare, selectați prima sarcină finalizată cu selectare și întreceți sarcinile unul împotriva celuilalt cu cursă.

Adaugă tokio ladă la dumneavoastră Marfă.toml secțiunea de dependențe a fișierului.

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

Iată cum puteți utiliza sintaxa async/wait în programele dvs. Rust cu 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 Salut Lume funcția este asincronă, deci poate utiliza asteapta cuvânt cheie pentru a-și întrerupe execuția până când un viitor este rezolvat. The Salut Lume se imprimă funcția "Buna ziua, " la consolă. The Durata:: from_secs (1) apelul funcției suspendă execuția funcției pentru o secundă. The asteapta cuvântul cheie așteaptă să se finalizeze viitorul somn. În cele din urmă, cel Salut Lume se imprimă funcția "Lume!" la consolă.

The principal funcția este o funcție asincronă cu #[tokio:: principal] atribut. Acesta desemnează funcția principală ca punct de intrare pentru timpul de rulare Tokio. The hello_world().wait execută funcția hello_world în mod asincron.

Întârzierea sarcinilor cu Tokio

O sarcină predominantă în programarea asincronă este utilizarea întârzierilor sau a sarcinilor de programare pentru a rula într-un interval de timp specificat. Tokio Runtime oferă un mecanism pentru utilizarea temporizatoarelor asincrone și a întârzierilor prin tokio:: timp modul.

Iată cum puteți întârzia o operație cu timpul de execuție 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 operațiune_întârziată funcția introduce o întârziere de două secunde cu dormi metodă. The operațiune_întârziată funcția este asincronă, deci poate folosi await pentru a-și întrerupe execuția până când întârzierea este completă.

Gestionarea erorilor în programele asincrone

Gestionarea erorilor în codul Rust asincron implică utilizarea Rezultat tip și tratarea erorilor de rugină cu ? operator.

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 funcția returnează an io:: Rezultat care reprezintă posibilitatea unei erori I/O. Prin folosirea ? operator după fiecare operațiune asincronă, Tokio runtime va propaga erorile în stiva de apeluri.

The principal funcția tratează rezultatul cu a Meci declarație care tipărește un text pe baza rezultatului operației.

Reqwest folosește programarea asincronă pentru operațiuni HTTP

Multe lăzi populare, inclusiv Reqwest, folosesc Tokio pentru a furniza operațiuni HTTP asincrone.

Puteți folosi Tokio cu Reqwest pentru a face mai multe solicitări HTTP fără a bloca alte sarcini. Tokio vă poate ajuta să gestionați mii de conexiuni simultane și să gestionați eficient resursele.