Az aszinkron programozás fontos fogalom, amellyel Rust fejlesztőként tisztában kell lennie.
A hagyományos szinkron programozási modellek gyakran vezetnek teljesítménybeli szűk keresztmetszetek kialakulásához. Ennek az az oka, hogy a program megvárja a lassú műveletek befejezését, mielőtt a következő feladatra lépne. Ez gyakran rossz erőforrás-felhasználást és lassú felhasználói élményt eredményez.
Az aszinkron programozás lehetővé teszi, hogy olyan nem blokkoló kódot írjon, amely hatékonyan használja fel a rendszer erőforrásait. Az aszinkron programozás kihasználásával több feladatot is végrehajtó alkalmazásokat tervezhet. Az aszinkron programozás számos hálózati kérés kezeléséhez vagy nagy mennyiségű adat feldolgozásához praktikus a végrehajtási folyamat blokkolása nélkül.
Aszinkron programozás Rustban
A Rust aszinkron programozási modellje lehetővé teszi írjon hatékony Rust kódot, amely párhuzamosan fut a végrehajtási folyamat blokkolása nélkül. Az aszinkron programozás előnyös I/O műveletek, hálózati kérések és külső erőforrásokra való várakozással járó feladatok kezelésekor.
Az aszinkron programozást a Rust alkalmazásaiban többféleképpen is megvalósíthatja. Ide tartoznak a nyelvi funkciók, a könyvtárak és a Tokio futtatókörnyezet.
Is, Rust tulajdonosi modellje és a párhuzamossági primitívek, mint a csatornák és zárak biztonságos és hatékony párhuzamos programozást tesznek lehetővé. Ezeket a funkciókat aszinkron programozással kihasználhatja olyan párhuzamos rendszerek létrehozásához, amelyek jól skálázhatók és több CPU-magot használnak.
Rust aszinkron programozási koncepciói
A Futures alapot ad az aszinkron programozáshoz a Rustban. A jövő egy aszinkron számítást jelent, amelyet még nem hajtottak végre teljesen.
A határidős ügyletek lusták (csak szavazáskor hajtják végre őket). Amikor jövőt hívsz közvélemény kutatás() módszerrel ellenőrzi, hogy a jövő elkészült-e, vagy további munkára van szüksége. Ha a jövő nincs készen, akkor visszatér Szavazás:: Függőben, jelezve, hogy a feladatot későbbi végrehajtásra kell ütemezni. Ha a jövő készen áll, visszatér Szavazás:: Kész a kapott értékkel.
A Rust szabványos eszközlánca aszinkron I/O primitíveket, a fájl I/O aszinkron verzióját, hálózatot és időzítőket tartalmaz. Ezek a primitívek lehetővé teszik az I/O műveletek aszinkron végrehajtását. Ez segít elkerülni a program végrehajtásának blokkolását, miközben az I/O feladatok befejezésére vár.
Az aszinkron/várakozás szintaxis lehetővé teszi a szinkron kódhoz hasonló aszinkron kód írását. Ez intuitívvá és könnyen karbantarthatóvá teszi a kódot.
A Rust aszinkron programozási megközelítése a biztonságot és a teljesítményt hangsúlyozza. A tulajdonlási és kölcsönzési szabályok biztosítják a memória biztonságát és megakadályozzák a gyakori párhuzamossági problémákat. Az aszinkron/várakozó szintaxis és a határidők intuitív módon fejezik ki az aszinkron munkafolyamatokat. Használhat harmadik féltől származó futtatókörnyezetet a feladatok kezeléséhez a hatékony végrehajtás érdekében.
Kombinálhatja ezeket a nyelvi funkciókat, könyvtárakat és futási környezetet, hogy nagy teljesítményű kódot írjon. Erőteljes és ergonomikus keretet biztosít az aszinkron rendszerek építéséhez. Emiatt a Rust népszerű választás az I/O-hoz kötött feladatok hatékony kezelését és nagy párhuzamosságot igénylő projektekhez.
A Rust 1.39-es és újabb verziói nem támogatják az aszinkron műveleteket a Rust szabványos könyvtárában. A használatához szüksége lesz egy harmadik féltől származó ládára async/várja szintaxis az aszinkron műveletek kezeléséhez a Rustban. Használhat harmadik féltől származó csomagokat, mint pl Tokio vagy async-std az async/await szintaxis használatához.
Aszinkron programozás Tokióval
A Tokio egy robusztus aszinkron futtatókörnyezet a Rust számára. Funkciókat biztosít nagy teljesítményű és méretezhető alkalmazások létrehozásához. Kiaknázhatja az aszinkron programozás erejét Tokióval. Bővíthetőséget is biztosít.
A Tokio középpontjában az aszinkron feladatütemezési és végrehajtási modell áll. A Tokio lehetővé teszi, hogy aszinkron kódot írjon az async/await szintaxissal. Ez lehetővé teszi a rendszer erőforrásainak hatékony kihasználását és a feladatok egyidejű végrehajtását. Tokio eseményhuroka hatékonyan kezeli a feladatok ütemezését. Ez biztosítja a CPU magok optimális kihasználását, és minimalizálja a környezetváltási többletterhelést.
A Tokio kombinátorai megkönnyítik a feladatok koordinálását és összeállítását. A Tokio hatékony koordinációs és kompozíciós eszközöket biztosít. A csatlakozással megvárhatja több feladat elvégzését, kiválasztással kiválaszthatja az első befejezett feladatot, és versenyzéssel versenyezhet egymással.
Add hozzá a tokio láda a tiédhez Cargo.toml fájl függőségei szakaszban.
[dependencies]
tokio = { version = "1.9", features = ["full"] }
A következőképpen használhatja az aszinkron/várakozás szintaxist a Rust programjaiban Tokióval:
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;
}
A Helló Világ funkció aszinkron, így használhatja a várja kulcsszó a végrehajtás szüneteltetéséhez, amíg egy jövőt meg nem oldanak. A Helló Világ függvény nyomtat "Helló, " a konzolhoz. A Időtartam:: from_sec (1) függvényhívás egy másodpercre felfüggeszti a függvény végrehajtását. A várja kulcsszó az alvási jövő befejezésére vár. Végül a Helló Világ függvény nyomtat "Világ!" a konzolhoz.
A fő- függvény aszinkron függvény a #[tokio:: fő] tulajdonság. Ez a fő funkciót jelöli ki a Tokio futási környezet belépési pontjaként. A hello_world().várj a hello_world függvényt aszinkron módon hajtja végre.
Feladatok késleltetése Tokióval
Az aszinkron programozásban elterjedt feladat a késleltetések vagy a feladatok ütemezése egy meghatározott időtartományban történő futtatáshoz. A tokio futási idő mechanizmust biztosít az aszinkron időzítők és késleltetések használatához a tokio:: idő modult.
Így késleltetheti a műveletet a Tokio futási környezettel:
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.");
}
A késleltetett_művelet funkció két másodperces késleltetést vezet be a alvás módszer. A késleltetett_művelet függvény aszinkron, így a await segítségével szüneteltetheti a végrehajtást, amíg a késleltetés be nem fejeződik.
Hibakezelés aszinkron programokban
Az aszinkron Rust kód hibakezelése magában foglalja a Eredmény típus és Rozsdahibák kezelése a... val ? operátor.
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),
}
}
A read_file_contents függvény egy io:: Eredmény ami egy I/O hiba lehetőségét jelenti. Használatával a ? operátort minden aszinkron művelet után, a Tokio futtatókörnyezet továbbítja a hibákat a hívási veremben.
A fő- függvény az eredményt a-val kezeli mérkőzés utasítás, amely a művelet eredménye alapján szöveget nyomtat.
A Reqwest aszinkron programozást használ a HTTP műveletekhez
Sok népszerű láda, köztük a Reqwest, a Tokiot használja az aszinkron HTTP műveletek biztosítására.
A Tokiot használhatja a Reqwest-tel, hogy több HTTP-kérést küldjön anélkül, hogy blokkolna más feladatokat. A Tokio segíthet több ezer párhuzamos kapcsolat kezelésében és az erőforrások hatékony kezelésében.