Pochopte Rustov prístup k súbežnosti, ktorý je založený na koncepte „neohrozenej súbežnosti“.

Súbežnosť je schopnosť programu vykonávať viacero úloh súčasne na tom istom jadre CPU. Súbežné úlohy sa spúšťajú a dokončia v prekrývajúcom sa čase bez určeného poradia, na rozdiel od paralelizmu, kde rôzne úlohy alebo podúlohy tej istej úlohy bežia súčasne na hardvéri s viacerými spracovateľov.

Rust vyniká svojimi výkonnými funkciami a podporou súbežnosti bezpečným a efektívnym spôsobom. Rustov prístup k súbežnosti je založený na koncepte „neohrozenej súbežnosti“, kde cieľom jazyka je uľahčiť bezpečné písanie. súbežný kód prostredníctvom systému vlastníctva a výpožičiek, ktorý presadzuje prísne pravidlá v čase kompilácie, aby sa zabránilo sledovaniu údajov a zabezpečila pamäť bezpečnosť.

Pochopenie súbežnosti v hrdze

Rust poskytuje niekoľko súbežných primitív na písanie súbežných programov, vrátane vlákien, odovzdávania správ, mutexov, atómových typov a async/wait pre asynchrónne programovanie.

Tu je prehľad Rustových súbežných primitív:

instagram viewer
  1. Nite: Hrdza poskytuje a std:: vlákno modul vo svojej štandardnej knižnici na vytváranie a správu vlákien. Môžete vytvárať nové vlákna pomocou vlákno:: poter funkciu. The vlákno:: poter prevezme uzávierku obsahujúcu kód na vykonanie. Môžete tiež spúšťať vlákna, ktoré môžu bežať paralelne, a Rust poskytuje synchronizačné primitíva na koordináciu ich vykonávania. Kontrolór pôžičiek zaisťuje, že odkazy nevedú k neočakávanému správaniu.
  2. Odovzdanie správy: Rustov model súbežnosti podporuje prenos správ medzi vláknami. Budete používať kanály implementované prostredníctvom std:: synchronizácia:: mpsc modul na odovzdávanie správ. Kanál pozostáva z vysielača (odosielateľ) a prijímač (Prijímač). Vlákna môžu posielať správy cez vysielač a prijímať ich cez prijímač. To poskytuje bezpečný a synchronizovaný spôsob komunikácie medzi vláknami.
  3. Mutexy a typy atómov: Rust poskytuje synchronizačné primitíva, vrátane mutexov (std:: synchronizácia:: Mutex) a atómové typy (std:: synchronizácia:: atómová), aby sa zabezpečil exkluzívny prístup na zdieľanie údajov. Mutexy umožňujú viacerým vláknam pristupovať k údajom súčasne, pričom zabraňujú pretekom údajov. Atómové typy poskytujú atómové operácie so zdieľanými údajmi, ako je zvýšenie počítadla, bez toho, aby vyžadovali explicitné uzamknutie.
  4. Async/Await and Futures: Hrdza async/čakať syntax poskytuje funkcie na písanie asynchrónneho kódu, ktorý môžete vykonávať súčasne. Asynchrónne programy efektívne riešia úlohy viazané na I/O, čo programom umožňuje vykonávať iné úlohy počas čakania na iné I/O operácie. Rust's async/čakať syntax je založená na futures a môžete ich napájať pomocou async-std alebo tokio runtime knižnice.

Hrdzavé vlákna sú ľahké a vďaka absencii réžie behu sú vhodné pre vysokovýkonné aplikácie. Rustove primitívy súbežnosti sa bezproblémovo integrujú s viacerými knižnicami a rámcami pre rôzne potreby súbežnosti.

Ako používať spawn vlákna v hrdze

Budete používať std:: vlákno modul na vytváranie vlákien. The std:: vlákno:: spawn funkcia vám umožňuje vytvoriť nové vlákno, ktoré bude bežať súbežne s hlavným vláknom alebo akýmkoľvek iným existujúcim vláknom vo vašom programe.

Tu je návod, ako môžete vytvoriť vlákno s std:: vlákno:: spawn funkcia:

použitie std:: vlákno;

fnHlavná() {
// Založí nové vlákno
nech thread_handle = thread:: spawn(|| {
// Kód spustený v novom vlákne ide sem
println!("Ahoj z nového vlákna!");
});

// Počkajte na dokončenie vytvoreného vlákna
thread_handle.join().unwrap();

// Kód spustený v hlavnom vlákne pokračuje tu
println!("Ahoj z hlavného vlákna!");
}

The Hlavná funkcia vytvorí nové vlákno s vlákno:: poter funkciou odovzdaním uzáveru obsahujúceho kód na vykonanie vo vlákne (v tomto prípade je uzáver anonymnou funkciou). Uzavretie vytlačí správu označujúcu, že je spustené nové vlákno.

The pripojiť sa metóda na niť_rukoväť umožňuje hlavnému vláknu čakať na dokončenie spustenia vytvoreného vlákna. Zavolaním pripojiť sa, funkcia zaisťuje, že hlavné vlákno čaká na dokončenie vytvoreného vlákna a až potom bude pokračovať.

Môžete vytvoriť viacero vlákien a použiť slučku alebo akúkoľvek inú Štruktúra kontroly hrdze na vytvorenie viacerých uzáverov a spawnových vlákien pre každú z nich.

použitie std:: vlákno;

fnHlavná() {
nech num_threads = 5;

nechmut závitové_rúčky = vec![];

pre i v0..num_threads {
nech thread_handle = thread:: spawn(pohybovať sa || {
println!("Dobrý deň z vlákna {}", i);
});
thread_handles.push (thread_handle);
}

pre rukoväť v závitové_rúčky {
handle.join().unwrap();
}

println!("Všetky vlákna sú ukončené!");
}

Cyklus for vytvorí päť vlákien, z ktorých každé je priradené jedinečnému identifikátoru i s premennou slučky. Uzávery zachytávajú hodnotu i s pohybovať sa kľúčové slovo, ktorému sa vyhnúť vlastnícke otázky, a niť_rukoväte vector ukladá vlákna na neskôr pripojiť sa slučka.

Po vytvorení všetkých vlákien, Hlavná funkcia iteruje cez niť_rukoväte vektor, hovory pripojiť sa na každej rukoväti a čaká na vykonanie všetkých vlákien.

Posielanie správ cez kanály

Správy môžete posielať cez vlákna s kanálmi. Rust poskytuje funkcie na odovzdávanie správ v std:: synchronizácia:: mpsc modul. Tu, mpsc znamená „viacnásobný výrobca, jeden spotrebiteľ“ a umožňuje komunikáciu medzi viacerými vláknami odosielaním a prijímaním správ cez kanály.

Tu je návod, ako implementujete prenos správ cez kanály medzivláknovej komunikácie vo svojich programoch:

použitie std:: synchronizácia:: mpsc;
použitie std:: vlákno;

fnHlavná() {
// Vytvorenie kanála
nech (odosielateľ, prijímač) = mpsc:: channel();

// Vytvorenie vlákna
vlákno:: spawn(pohybovať sa || {
// Odoslať správu cez kanál
odosielateľ.odoslať("Ahoj z vlákna!").rozbaliť();
});

// Prijmite správu v hlavnom vlákne
nech prijata_sprava = prijemca.recv().unwrap();
println!("Prijatá správa: {}", prijatá_správa);
}

The Hlavná funkcia vytvorí kanál s mpsc:: kanál() ktorý vracia a odosielateľa a a prijímač. The odosielateľa posiela správy na prijímač ktorý prijíma správy. The Hlavná funkcia pokračuje pri vytváraní vlákien a presúvaní vlastníctva odosielateľ k uzáveru závitu. Vo vnútri závitového uzáveru je odosielateľ.odoslať() funkcia odošle správu cez kanál.

The receiver.recv() funkcia prijme správu zastavením vykonávania, kým vlákno neprijme správu. The Hlavná funkcia vytlačí správu do konzoly po úspešnom prijatí správy.

Upozorňujeme, že odoslanie správy cez kanál spotrebuje odosielateľa. Ak potrebujete odosielať správy z viacerých vlákien, môžete odosielateľa naklonovať pomocou súboru odosielateľ.klon() funkciu.

Okrem toho, mpsc modul poskytuje ďalšie metódy ako try_recv(), ktorý sa neblokujúci pokúša prijať správu, a iter(), ktorý vytvorí iterátor nad prijatými správami.

Odovzdávanie správ cez kanály poskytuje bezpečný a pohodlný spôsob komunikácie medzi vláknami, pričom sa vyhýba pretekom údajov a zabezpečuje správnu synchronizáciu.

Model vlastníctva a požičiavania spoločnosti Rust zaručuje bezpečnosť pamäte

Rust kombinuje vlastníctvo, požičiavanie a kontrolu pôžičiek, aby poskytoval robustný, bezpečný a súbežný programovací rámec.

Nástroj na kontrolu výpožičiek funguje ako bezpečnostná sieť, ktorá zisťuje potenciálne problémy v čase kompilácie, namiesto toho, aby sa spoliehala na kontroly za behu alebo zber odpadu.