Shvatite Rustov pristup konkurentnosti koji se temelji na konceptu "neustrašive konkurentnosti".
Konkurentnost je sposobnost programa da izvršava više zadataka istovremeno na istoj CPU jezgri. Istovremeni zadaci se izvode i dovršavaju u preklapajućem vremenu bez određenog redoslijeda, za razliku od paralelizma, gdje se različiti zadaci ili podzadaci istog zadatka izvode u isto vrijeme na hardveru s više procesori.
Rust se ističe svojim značajkama performansi i podrškom za konkurentnost na siguran i učinkovit način. Rustov pristup konkurentnosti temelji se na konceptu "neustrašive konkurentnosti" gdje jezik ima za cilj olakšati sigurno pisanje istovremeni kod kroz sustav vlasništva i posuđivanja koji provodi stroga pravila u vrijeme kompajliranja kako bi se spriječili tragovi podataka i osigurala memorija sigurnost.
Razumijevanje konkurentnosti u Rustu
Rust pruža nekoliko primitiva konkurentnosti za pisanje konkurentnih programa, uključujući niti, prosljeđivanje poruka, mutekse, atomske tipove i async/await za asinkrono programiranje.
Evo pregleda Rustovih primitiva konkurentnosti:
- niti: Rust pruža a std:: konac modul u svojoj standardnoj biblioteci za stvaranje i upravljanje nitima. Možete pokrenuti nove niti s konac:: mrijest funkcija. The konac:: mrijest preuzima zatvaranje koje sadrži kod za izvršenje. Također možete pokretati niti koje se mogu izvoditi paralelno, a Rust pruža primitive za sinkronizaciju za koordinaciju njihovog izvođenja. Kontrolor posudbe osigurava da reference ne dovode do neočekivanih ponašanja.
- Prijenos poruka: Rustov model konkurentnosti podržava prijenos poruka između niti. Koristit ćete kanale implementirane putem std:: sync:: mpsc modul za prosljeđivanje poruka. Kanal se sastoji od odašiljača (Pošiljatelj) i prijemnik (Prijamnik). Niti mogu slati poruke preko odašiljača i primati ih preko prijemnika. To omogućuje siguran i sinkroniziran način komunikacije između niti.
- Muteksi i atomski tipovi: Rust pruža primitive sinkronizacije, uključujući mutekse (std:: sync:: Mutex) i atomske vrste (std:: sync:: atomski), kako bi se osigurao ekskluzivni pristup dijeljenju podataka. Muteksi dopuštaju višestrukim nitima da istovremeno pristupaju podacima dok istovremeno sprječavaju utrku podataka. Atomski tipovi pružaju atomske operacije nad zajedničkim podacima, kao što je povećanje brojača, bez potrebe za izričitim zaključavanjem.
- Async/Await i Futures: Rustovo asinkroni/čekati sintaksa pruža funkcionalnost za pisanje asinkronog koda koji možete izvršavati istovremeno. Asinkroni programi učinkovito rješavaju I/O-vezane zadatke omogućujući programima da obavljaju druge zadatke dok čekaju druge I/O operacije. Rustovo asinkroni/čekati sintaksa se temelji na budućnosti, a možete ih pokretati pomoću asinkroni-std ili tokio runtime knjižnice.
Rust niti su lagane, a odsutnost opterećenja tijekom rada čini ih prikladnima za aplikacije visokih performansi. Rustove primitive konkurentnosti besprijekorno se integriraju s više biblioteka i okvira za različite potrebe istovremenosti.
Kako koristiti Spawn niti u Rustu
Vi ćete koristiti std:: konac modul za stvaranje niti. The std:: thread:: spawn funkcija vam omogućuje stvaranje nove niti koja će se izvoditi istodobno s glavnom niti ili bilo kojom drugom postojećom niti u vašem programu.
Evo kako možete pokrenuti nit s std:: thread:: spawn funkcija:
koristiti std:: konac;
fnglavni() {
// Pokreće novu nit
neka thread_handle = thread:: spawn(|| {
// Kod koji se izvodi u novoj niti ide ovdje
println!("Pozdrav iz nove teme!");
});// Pričekajte da stvorena nit završi
thread_handle.join().unwrap();
// Kod koji se izvodi u glavnoj niti nastavlja se ovdje
println!("Pozdrav iz glavne teme!");
}
The glavni funkcija stvara novu nit s konac:: mrijest funkciju prosljeđivanjem zatvaranja koji sadrži kod za izvođenje u niti (u ovom slučaju, zatvaranje je anonimna funkcija). Zatvaranje ispisuje poruku koja pokazuje da je nova nit pokrenuta.
The pridružiti metoda na držač_niti dopušta glavnoj niti da čeka da stvorena nit završi izvršenje. Pozivom pridružiti, funkcija osigurava da glavna nit čeka da se pokrenuta nit dovrši prije nego što nastavi.
Možete stvoriti više niti i koristiti petlju ili bilo koju drugu Struktura za kontrolu hrđe za stvaranje višestrukih zatvaranja i stvaranje niti za svako.
koristiti std:: konac;
fnglavni() {
neka broj_niti = 5;nekamut ručke_nit = vec![];
za ja u0..broj_niti {
neka thread_handle = thread:: spawn(potez || {
println!("Pozdrav iz niti {}", i);
});
ručke_niti.guranje (ručka_niti);
}za drška u rukovanje_nitima {
handle.join().unwrap();
}
println!("Sve niti završene!");
}
Petlja for stvara pet niti, od kojih je svaka dodijeljena jedinstvenom identifikatoru ja s varijablom petlje. Zatvarači bilježe vrijednost ja s potez ključna riječ koju treba izbjegavati pitanja vlasništva, i ručke_niti vektor pohranjuje niti za kasnije u pridružiti petlja.
Nakon pokretanja svih niti, the glavni funkcija ponavlja preko ručke_niti vektor, pozivi pridružiti na svakoj ručki i čeka da se izvrše sve niti.
Slanje poruka kroz kanale
Možete proslijediti poruke kroz niti s kanalima. Rust pruža funkcionalnost za prosljeđivanje poruka u std:: sync:: mpsc modul. Ovdje, mpsc označava "više proizvođača, jedan potrošač" i omogućuje komunikaciju između više niti slanjem i primanjem poruka putem kanala.
Evo kako u svojim programima implementirate prolazak poruka kroz kanale komunikacije među nitima:
koristiti std:: sync:: mpsc;
koristiti std:: konac;fnglavni() {
// Stvorite kanal
neka (pošiljatelj, primatelj) = mpsc:: kanal();// Pokreće nit
thread:: spawn(potez || {
// Pošaljite poruku putem kanala
pošiljatelj.pošalji("Pozdrav iz teme!").razmotati();
});
// Primi poruku u glavnoj niti
neka primljena_poruka = receiver.recv().unwrap();
println!("Primljena poruka: {}", primljena_poruka);
}
The glavni funkcija stvara kanal sa mpsc:: kanal() koji vraća a pošiljatelj i a prijamnik. The pošiljatelj šalje poruke na prijamnik koji prima poruke. The glavni funkcija nastavlja stvarati niti i premješta vlasništvo nad Pošiljatelj do zatvaranja navoja. Unutar zatvarača navoja, pošiljatelj.pošalji() funkcija šalje poruku kroz kanal.
The prijemnik.recv() funkcija prima poruku zaustavljanjem izvršenja dok nit ne primi poruku. The glavni funkcija ispisuje poruku na konzolu nakon uspješnog primitka poruke.
Imajte na umu da slanje poruke putem kanala troši pošiljatelja. Ako trebate slati poruke iz više niti, možete klonirati pošiljatelja pomoću pošiljatelj.klon() funkcija.
Osim toga, mpsc modul pruža druge metode kao što su try_recv(), koji bez blokiranja pokušava primiti poruku, i iter(), koji stvara iterator preko primljenih poruka.
Prolaz poruka kroz kanale pruža siguran i prikladan način komunikacije između niti uz izbjegavanje podatkovne utrke i osiguravanje pravilne sinkronizacije.
Rustov model vlasništva i posuđivanja jamči sigurnost memorije
Rust kombinira vlasništvo, posuđivanje i provjeru posuđivanja kako bi pružio robustan, siguran, konkurentni programski okvir.
Alat za provjeru posuđivanja djeluje kao sigurnosna mreža, otkrivajući potencijalne probleme tijekom kompajliranja, umjesto da se oslanja na provjere vremena izvođenja ili sakupljanje smeća.