Rust में कार्य अनुसूचक: सरल टाइमर से लेकर औद्योगिक job scheduler तक
\n\nकार्य अनुसूचक (job scheduler) किसी भी गंभीर एप्लिकेशन के प्रमुख घटकों में से एक है। Rust पर आप एक ऐसी प्रणाली बना सकते हैं जो मिलीसेकंड की सटीकता से निष्पादित होगी, न्यूनतम मेमोरी की खपत करेगी और वर्षों तक बिना किसी रुकावट के काम करेगी। इस लेख में, हम मानक साधनों और लोकप्रिय क्रेट्स दोनों का उपयोग करके Rust में कार्य अनुसूचक बनाने का तरीका समझेंगे।
\n\nRust में अनुसूचक क्यों लिखें?
\n\nRust प्रदर्शन और सुरक्षा का एक अनूठा संयोजन प्रदान करता है। Rust में कार्य अनुसूचक:
\n\n- \n
- डेटा रेस (data races) की अनुपस्थिति की गारंटी देता है — कंपाइलर बिल्ड चरण में इसकी जाँच करता है। \n
- बिना कचरा संग्रहक (garbage collector) के काम करता है — कार्यों के निष्पादन में पूर्वानुमानित विलंब। \n
- अतुल्यकालिक और मल्टीथ्रेडेड दोनों निष्पादन का समर्थन करता है। \n
- न्यूनतम मेमोरी खपत — हजारों कार्य चलाए जा सकते हैं। \n
std::thread::sleep के साथ सबसे सरल अनुसूचक
\n\nएक बुनियादी उदाहरण से शुरू करते हैं — हर N सेकंड में कार्य का चक्रीय निष्पादन:
\n\nuse std::thread;\nuse std::time::Duration;\n\nfn main() {\n let interval = Duration::from_secs(5);\n \n loop {\n println!("[{}] कार्य निष्पादित कर रहा हूँ...", chrono::Local::now().format("%H:%M:%S"));\n // यहाँ आपका कार्य कोड\n thread::sleep(interval);\n }\n}\n\nयह दृष्टिकोण सरल है, लेकिन अकुशल: वर्तमान थ्रेड ब्लॉक हो जाता है, कई कार्यों को समानांतर में चलाने की कोई संभावना नहीं है।
\n\ntokio पर अतुल्यकालिक अनुसूचक
\n\nवास्तविक परियोजनाओं के लिए tokio का उपयोग करें — एक अतुल्यकालिक रनटाइम जो एक थ्रेड में हजारों कार्यों को चलाने की अनुमति देता है।
use tokio::time::{interval, Duration};\n\n#[tokio::main]\nasync fn main() {\n let mut timer = interval(Duration::from_secs(10));\n \n println!("अनुसूचक प्रारंभ हुआ। कार्य हर 10 सेकंड में निष्पादित होगा।");\n \n loop {\n timer.tick().await;\n println!("[{}] कार्य निष्पादित कर रहा हूँ...", chrono::Local::now().format("%H:%M:%S"));\n // अतुल्यकालिक कार्य: उदाहरण के लिए, API अनुरोध\n do_work().await;\n }\n}\n\nasync fn do_work() {\n // उपयोगी कार्य का अनुकरण\n tokio::time::sleep(Duration::from_millis(500)).await;\n println!("कार्य पूर्ण हुआ।");\n}\n\nलाभ: थ्रेड को ब्लॉक नहीं करता, सैकड़ों ऐसे अनुसूचक समानांतर में चलाए जा सकते हैं।
\n\ncron क्रेट के साथ CRON-जैसी अनुसूची
\n\nयदि जटिल अनुसूचियाँ (जैसे Linux cron में) सेट करने की आवश्यकता है, तो cron क्रेट का उपयोग करें:
use cron::Schedule;\nuse chrono::Utc;\nuse std::str::FromStr;\n\nfn main() {\n // हर मिनट के 30वें सेकंड पर\n let expression = "30 * * * * *";\n let schedule = Schedule::from_str(expression).unwrap();\n \n println!("अगले 5 प्रारंभ:");\n for datetime in schedule.upcoming(Utc).take(5) {\n println!(" {}", datetime);\n }\n}\n\nयहाँ वास्तविक निष्पादन के साथ एक अधिक पूर्ण उदाहरण है:
\n\nuse cron::Schedule;\nuse chrono::{Utc, Local};\nuse std::thread;\nuse std::time::Duration;\nuse std::str::FromStr;\n\nfn main() {\n // हर 15 सेकंड में\n let expression = "0/15 * * * * *";\n let schedule = Schedule::from_str(expression).unwrap();\n \n loop {\n let now = Utc::now();\n if let Some(next) = schedule.upcoming(Utc).next() {\n let delay = next - now;\n let millis = delay.num_milliseconds().max(0) as u64;\n \n thread::sleep(Duration::from_millis(millis));\n \n println!("[{}] अनुसूचित कार्य!", Local::now().format("%H:%M:%S"));\n // कार्य का निष्पादन\n } else {\n thread::sleep(Duration::from_secs(1));\n }\n }\n}\n\nमल्टीथ्रेडिंग के साथ औद्योगिक अनुसूचक
\n\nगंभीर परियोजनाओं के लिए, एक Scheduler संरचना बनाएँ
पुस्तकालय में भी
C++ के लिए Swagger/OpenAPI जनरेशन: टूल्स और लाइब्रेरीज़ का अवलोकन
JavaMail (Jakarta Mail) Java: पूरी गाइड उदाहरण सहित
C# (.NET) में HTML पार्सिंग: लाइब्रेरीज़ और कोड उदाहरण
Swift में Observation: पूरी गाइड उदाहरणों के साथ