Crossbeam चैनल
उन्नत चैनल
Crossbeam चैनल, CoddyKit पर Rust कोडिंग सीखें का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Rust कोडिंग सीखें सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Rust कोडिंग सीखें पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
मानक std mpsc से आगे
मानक mpsc चैनल में एकल उपभोक्ता होता है: केवल एक रिसीवर। crossbeam-channel क्रेट अधिक सुविधाओं और अक्सर बेहतर प्रदर्शन वाले बहु-उत्पादक, बहु-उपभोक्ता (mpmc) चैनल उपलब्ध कराता है।
मुख्य विशेषताएँ:
- केवल प्रेषकों ही नहीं, बल्कि क्लोन किए जा सकने वाले
Receiverभी। - कई चैनलों पर प्रतीक्षा करने के लिए शक्तिशाली
select!मैक्रो। - सीमित, असीमित और टिक जैसे विशेष चैनल।
निर्भरता जोड़ना
Crossbeam एक बाहरी क्रेट है, इसलिए इसे Cargo.toml में जोड़ें:
[dependencies]crossbeam-channel = "0.5"
फिर इसके फ़ंक्शन इम्पोर्ट करें। इसके लिए Cargo और बाहरी क्रेट की आवश्यकता होती है, इसलिए यहाँ दिए गए स्निपेट स्वतंत्र रूप से चलने के बजाय API को समझाने के लिए हैं।
// Cargo.toml
// [dependencies]
// crossbeam-channel = "0.5"
use crossbeam_channel::unbounded;
fn main() {
let (s, r) = unbounded();
s.send("hello").unwrap();
println!("{}", r.recv().unwrap());
}unbounded और bounded
Crossbeam दो मुख्य कंस्ट्रक्टर उपलब्ध कराता है:
unbounded()आवश्यकता के अनुसार बढ़ता है;sendकभी अवरुद्ध नहीं होता।bounded(cap)में निश्चित बफ़र होता है; भर जाने परsendअवरुद्ध हो जाता है और बैकप्रेशर मिलता है।
bounded(0) चैनल एक मिलन-बिंदु चैनल होता है, जहाँ send और recv सीधे एक-दूसरे को मान सौंपते हैं।
use crossbeam_channel::bounded;
use std::thread;
fn main() {
let (s, r) = bounded(2);
thread::spawn(move || {
for i in 1..=3 {
s.send(i).unwrap();
}
});
while let Ok(v) = r.recv() {
println!("got {}", v);
}
}कई उपभोक्ता
मुख्य लाभ यह है कि आप Receiver का क्लोन बना सकते हैं। कई वर्कर थ्रेड एक ही चैनल से संदेश ले सकते हैं और प्रत्येक संदेश उनमें से ठीक एक थ्रेड को मिलता है। यही कार्य-वितरण करने वाले थ्रेड पूल का आधार है।
use crossbeam_channel::unbounded;
use std::thread;
fn main() {
let (s, r) = unbounded();
let mut workers = vec![];
for id in 0..3 {
let rx = r.clone();
workers.push(thread::spawn(move || {
while let Ok(job) = rx.recv() {
println!("worker {} got job {}", id, job);
}
}));
}
for job in 0..6 { s.send(job).unwrap(); }
drop(s);
for w in workers { w.join().unwrap(); }
}select! मैक्रो
select! एक थ्रेड को कई चैनल संक्रियाओं पर प्रतीक्षा करने देता है और जो पहले तैयार हो, उस पर कार्य करता है। यह चैनल घटनाओं पर किए गए match जैसा है और कई स्रोतों से आने वाले inputs को मिलाने के लिए आदर्श है।
use crossbeam_channel::{unbounded, select};
use std::thread;
fn main() {
let (s1, r1) = unbounded();
let (s2, r2) = unbounded();
thread::spawn(move || { s1.send("from one").unwrap(); });
thread::spawn(move || { s2.send("from two").unwrap(); });
for _ in 0..2 {
select! {
recv(r1) -> msg => println!("r1: {}", msg.unwrap()),
recv(r2) -> msg => println!("r2: {}", msg.unwrap()),
}
}
}select! के साथ समय-सीमा
select! default आर्म और recv(after(duration)) टाइमर आर्म का समर्थन करता है, इसलिए आप हमेशा के लिए अवरुद्ध होने के बजाय समय-सीमा पूरी होने पर प्रतीक्षा छोड़ सकते हैं। उत्तरदायी प्रणालियों के लिए यह आवश्यक है।
use crossbeam_channel::{unbounded, select, after};
use std::time::Duration;
fn main() {
let (_s, r) = unbounded::<i32>();
select! {
recv(r) -> msg => println!("received {:?}", msg),
recv(after(Duration::from_millis(100))) -> _ => {
println!("timed out waiting for a message");
}
}
}try_send और try_recv
मानक लाइब्रेरी की तरह, crossbeam भी बिना अवरोध वाले विकल्प उपलब्ध कराता है। सीमित चैनल भर जाने पर try_send तुरंत विफल हो जाता है; कोई संदेश तैयार न होने पर try_recv भी तुरंत विफल हो जाता है। दोनों ऐसे वर्णनात्मक error लौटाते हैं, जिन पर आप match कर सकते हैं।
use crossbeam_channel::{bounded, TrySendError};
fn main() {
let (s, _r) = bounded(1);
s.send(1).unwrap();
match s.try_send(2) {
Ok(()) => println!("sent"),
Err(TrySendError::Full(v)) => println!("full, kept {}", v),
Err(TrySendError::Disconnected(v)) => println!("closed, kept {}", v),
}
}tick और आवधिक कार्य
tick(duration) फ़ंक्शन ऐसा रिसीवर लौटाता है, जो निश्चित अंतराल पर एक संदेश देता है। इसे select! के साथ जोड़कर अन्य चैनलों के साथ आवधिक कार्य चलाएँ, जैसे heartbeat या polling loop।
use crossbeam_channel::{tick, select};
use std::time::Duration;
fn main() {
let ticker = tick(Duration::from_millis(50));
let mut count = 0;
while count < 3 {
select! {
recv(ticker) -> _ => {
count += 1;
println!("tick {}", count);
}
}
}
}चरणों की एक पाइपलाइन
Crossbeam पाइपलाइन बनाने में उत्कृष्ट है: पहला चरण डेटा तैयार करता है, दूसरा उसे रूपांतरित करता है और तीसरा उसका उपयोग करता है। प्रत्येक चरण चैनलों से जुड़े अपने थ्रेड पर चलता है, और क्लोन किए गए रिसीवर आपको किसी भी चरण को कई वर्करों तक विस्तारित करने देते हैं।
use crossbeam_channel::unbounded;
use std::thread;
fn main() {
let (in_s, in_r) = unbounded();
let (out_s, out_r) = unbounded();
thread::spawn(move || {
for n in in_r { out_s.send(n * n).unwrap(); }
});
for n in 1..=4 { in_s.send(n).unwrap(); }
drop(in_s);
for sq in out_r { println!("square: {}", sq); }
}जब Crossbeam, std से बेहतर होता है
जब आपको निम्न सुविधाएँ चाहिए हों, तब crossbeam-channel का उपयोग करें:
- एक ही कतार साझा करने वाले कई उपभोक्ता (वर्कर पूल)।
- टाइमआउट के साथ कई चैनलों पर
select!। - चयन प्रक्रिया में एकीकृत
tickके माध्यम से आवधिक टाइमर।
एक सरल, एक-उत्पादक और एक-उपभोक्ता पाइप के लिए मानक mpsc पर्याप्त है और इसके लिए किसी निर्भरता की आवश्यकता नहीं होती।
चैनल को छोड़ने पर वे बंद हो जाते हैं
std की तरह ही, crossbeam चैनल तब बंद होते हैं जब रिसीवर की ओर से सभी प्रेषकों या प्रेषक की ओर से सभी रिसीवरों को छोड़ दिया जाता है। अंतिम प्रेषक के छूट जाने के बाद रिसीवर पर पुनरावृत्ति समाप्त हो जाती है। अपने प्रेषकों को हमेशा drop करें या उनका दायरा सीमित करें, ताकि वर्कर लूप साफ़-सुथरे ढंग से समाप्त हो सकें।
use crossbeam_channel::unbounded;
use std::thread;
fn main() {
let (s, r) = unbounded();
let h = thread::spawn(move || {
let total: i32 = r.iter().sum();
println!("total: {}", total);
});
for i in 1..=5 { s.send(i).unwrap(); }
drop(s); // closes channel so the loop ends
h.join().unwrap();
}त्वरित जाँच
crossbeam चैनलों की अपनी समझ जाँचें।
पुनरावलोकन
आपने crossbeam चैनलों का अध्ययन किया:
- वे mpmc होते हैं: प्रेषकों और रिसीवरों, दोनों के क्लोन बनाए जा सकते हैं।
unbounded()औरbounded(n)बफ़रिंग और बैकप्रेशर को नियंत्रित करते हैं।select!कई चैनलों पर प्रतीक्षा करता है; टाइमआउट के लिएafterऔर आवधिकtickका उपयोग किया जाता है।try_send/try_recvअवरोध-रहित होते हैं।- वर्कर पूल और जटिल पाइपलाइन के लिए crossbeam का, तथा सरल पाइप के लिए std mpsc का उपयोग करें।
एआई शिक्षक के साथ Rust सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 39
- पाठ
- 144
अक्सर पूछे जाने वाले प्रश्न
क्या “Crossbeam चैनल” पाठ निःशुल्क है?
हाँ — Rust कोडिंग सीखें अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “Crossbeam चैनल” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Rust कोडिंग सीखें पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“Crossbeam चैनल” में मैं क्या सीखूँगा?
उन्नत चैनल आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Rust कोडिंग सीखें का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Rust कोडिंग सीखें शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Rust कोडिंग सीखें शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।
“Crossbeam चैनल” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Rust कोडिंग सीखें पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Rust कोडिंग सीखें पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- mpsc चैनल
- Arc/Mutex से अवस्था साझा करना
- स्कोप वाले थ्रेड
- Crossbeam चैनल