Rust में एसिंक्रोनस प्रोग्रामिंग का परिचय
एसिंक्रोनस प्रोग्रामिंग एक दृष्टिकोण है जो आपके एप्लिकेशन को निष्पादन के मुख्य थ्रेड को ब्लॉक किए बिना एक साथ कई कार्यों को कुशलतापूर्वक करने की अनुमति देता है। Rust में, यह दृष्टिकोण async/await मॉडल के माध्यम से लागू किया गया है, जो भाषा की विशेषता मेमोरी सुरक्षा और उच्च प्रदर्शन सुनिश्चित करता है।
पारंपरिक मल्टीथ्रेडिंग के विपरीत, एसिंक्रोनस कोड एक या अधिक थ्रेड के भीतर काम करता है, प्रतीक्षा के दौरान कार्यों के बीच स्विच करता है (उदाहरण के लिए, I/O या नेटवर्क अनुरोध)। यह इसे उच्च-लोड वेब सर्वर, नेटवर्क एप्लिकेशन और डेटा प्रोसेसिंग टूल बनाने के लिए आदर्श बनाता है।
इस लेख में, हम Rust में एसिंक्रोनस प्रोग्रामिंग की मूल बातें समझेंगे: प्रमुख अवधारणाओं से लेकर व्यावहारिक उदाहरणों तक। आप सीखेंगे कि Future, async और await कैसे काम करते हैं, लोकप्रिय रनटाइम Tokio से परिचित होंगे और अपना पहला एसिंक्रोनस प्रोजेक्ट लिखेंगे।
मुख्य अवधारणाएँ: Future, async और await
Future क्या है?
Rust में, एक एसिंक्रोनस कार्य को Future ट्रेट द्वारा दर्शाया जाता है। Future एक मान है जो अभी तक तैयार नहीं हो सकता है, लेकिन भविष्य में प्राप्त होगा। प्रत्येक Future में एक poll विधि होती है जो जाँचती है कि कार्य पूरा हुआ है या नहीं। यदि कार्य अभी भी निष्पादित हो रहा है, तो Pending लौटाया जाता है; यदि पूरा हो गया है, तो Ready(value) लौटाया जाता है।
अपने आप में, Future कोई कार्य नहीं करता है। यह केवल वर्णन करता है कि क्या होना चाहिए। एसिंक्रोनस कोड को निष्पादित करने के लिए एक रनटाइम की आवश्यकता होती है - एक निष्पादक जो Future को पोल करता है और उनके निष्पादन का प्रबंधन करता है।
async और await कीवर्ड
async कीवर्ड एक सामान्य फ़ंक्शन को एसिंक्रोनस फ़ंक्शन में बदल देता है, जो एक Future लौटाता है। उदाहरण के लिए:
async fn hello() -> String { "नमस्ते, दुनिया!".to_string()}Future से परिणाम प्राप्त करने के लिए, .await का उपयोग किया जाता है। यह तब तक वर्तमान फ़ंक्शन के निष्पादन को रोकता है जब तक Future पूरा नहीं हो जाता:
let result = hello().await;println!("{}", result);महत्वपूर्ण: .await का उपयोग केवल एसिंक्रोनस फ़ंक्शन या async {} ब्लॉक के अंदर ही किया जा सकता है।
एसिंक्रोनस कार्य का जीवनचक्र
Futureका निर्माण (एसिंक्रोनस फ़ंक्शन को कॉल करना)।- निष्पादन के लिए
Futureको रनटाइम को सौंपना। - रनटाइम
pollके माध्यम सेFutureको पोल करता है। - यदि कार्य ब्लॉक हो जाता है (I/O की प्रतीक्षा), रनटाइम दूसरे कार्य पर स्विच करता है।
- जब परिणाम तैयार होता है,
FutureReadyलौटाता है।
इकोसिस्टम: Tokio और async-std
Rust में एसिंक्रोनस कोड के साथ काम करने के लिए एसिंक्रोनस रनटाइम का उपयोग किया जाता है। दो सबसे लोकप्रिय हैं Tokio और async-std।
Tokio
Tokio Rust में एसिंक्रोनस प्रोग्रामिंग के लिए उद्योग मानक है। यह एक मल्टीथ्रेडेड शेड्यूलर, एसिंक्रोनस इनपुट-आउटपुट, टाइमर, सिंक्रोनाइज़ेशन और नेटवर्क प्रोटोकॉल प्रदान करता है। अधिकांश बड़े प्रोजेक्ट (जैसे Hyper, Tonic, Axum) Tokio पर बने हैं।
Tokio के साथ शुरू करने के लिए, Cargo.toml में निर्भरता जोड़ें:
[dependencies]tokio = { version = "1", features = ["full"] }एसिंक्रोनस कोड चलाने के लिए मुख्य मैक्रो #[tokio::main] है:
#[tokio::main]async fn main() { println!("Tokio से नमस्ते!");}async-std
async-std एक वैकल्पिक रनटाइम है जो Rust की मानक लाइब्रेरी के जितना संभव हो उतना समान होने का प्रयास करता है। यह शुरुआती के लिए सरल है, लेकिन प्रोडक्शन में कम लोकप्रिय है।
उदाहरण