Crossbeam Kanalları
Gelişmiş kanallar
Crossbeam Kanalları, CoddyKit'te ücretsiz bir Learn Rust Coding dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Learn Rust Coding öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Learn Rust Coding kursu toplamda 4 dersten oluşur.
std mpsc'nin Ötesi
Standart mpsc kanalı tek tüketicilidir: yalnızca bir alıcısı vardır. crossbeam-channel paketi, daha fazla özellik ve çoğu zaman daha iyi performans sunan çok üreticili, çok tüketicili (mpmc) kanallar sağlar.
Öne çıkanlar:
- Yalnızca göndericiler değil, klonlanabilir
Receiverdeğerleri de vardır. - Birçok kanalı beklemek için güçlü bir
select!makrosu. - Sınırlı, sınırsız ve tikler gibi özel kanallar.
Bağımlılığı Ekleme
Crossbeam harici bir pakettir; bu nedenle onu Cargo.toml dosyasına ekleyin:
[dependencies]crossbeam-channel = "0.5"
Ardından işlevlerini içe aktarın. Bunun için Cargo ve harici bir paket gerektiğinden, buradaki parçacıklar tek başına çalışmak yerine API'yi gösterir.
// 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 ve bounded
Crossbeam iki ana oluşturucu sunar:
unbounded()gerektiğinde büyür;sendhiçbir zaman engellenmez.bounded(cap)sabit boyutlu bir arabelleğe sahiptir; arabellek doluykensendengellenir ve bu da geri basınç sağlar.
bounded(0) kanalı, send ve recv işlemlerinin doğrudan el değiştirdiği bir buluşma kanalıdır.
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);
}
}Birden Çok Tüketici
Temel avantaj şudur: Receiver'ı klonlayabilirsiniz. Birden çok çalışan iş parçacığı aynı kanaldan veri çekebilir ve her ileti bunlardan tam olarak birine gider. Bu, iş çalan bir iş parçacığı havuzunun temelini oluşturur.
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! Makrosu
select!, bir iş parçacığının birden çok kanal işlemini beklemesini ve ilk hazır olan işlem üzerinde çalışmasını sağlar. Bu, kanal olayları üzerinde kullanılan bir match gibidir ve çeşitli kaynaklardan gelen girdileri birleştirmek için idealdir.
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! ile Zaman Aşımları
select!, bir default kolunu ve bir recv(after(duration)) zamanlayıcı kolunu destekler. Böylece sonsuza kadar engellenmek yerine bir zaman aşımından sonra beklemekten vazgeçebilirsiniz. Bu, yanıt verebilir sistemler için zorunludur.
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 ve try_recv
Standart kitaplıkta olduğu gibi crossbeam de engellemesiz çeşitler sağlar. try_send, sınırlı bir kanal doluysa hemen başarısız olur; try_recv ise hazır ileti yoksa hemen başarısız olur. Her ikisi de üzerinde eşleştirme yapabileceğiniz açıklayıcı bir hata döndürür.
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 ve Periyodik Çalışma
tick(duration) işlevi, sabit aralıklarla bir ileti sağlayan bir alıcı döndürür. Bunu select! ile birleştirerek kalp atışı veya yoklama döngüsü gibi periyodik görevleri diğer kanalların yanında çalıştırabilirsiniz.
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);
}
}
}
}Aşamalardan Oluşan Bir Pipeline
Crossbeam pipeline oluşturma konusunda çok başarılıdır: birinci aşama üretir, ikinci aşama dönüştürür, üçüncü aşama tüketir. Her aşama, kanallarla birbirine bağlanan kendi iş parçacığında çalışır ve klonlanmış alıcılar herhangi bir aşamayı birden çok çalışana ölçeklendirmenizi sağlar.
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'yi Ne Zaman Geçer
Şu ihtiyaçlarınız olduğunda crossbeam-channel kullanın:
- Tek bir kuyruğu paylaşan birden çok tüketici (çalışan havuzları).
- Zaman aşımlarıyla birlikte birçok kanal üzerinde
select!. - Seçime entegre edilmiş
tickaracılığıyla periyodik zamanlayıcılar.
Basit bir tek üreticili-tek tüketicili boru için standart mpsc yeterlidir ve bağımlılık gerektirmez.
Kanallar Bırakılarak Kapatılır
std'de olduğu gibi crossbeam kanalları da alıcı tarafı için tüm göndericiler veya gönderici tarafı için tüm alıcılar bırakıldığında kapanır. Bir alıcı üzerinde yineleme, son gönderici bırakıldıktan sonra sona erer. Çalışan döngülerinin temiz biçimde çıkabilmesi için göndericilerinizi her zaman drop edin veya kapsam içine alın.
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();
}Hızlı Kontrol
Crossbeam kanalları konusundaki anlayışınızı test edin.
Özet
crossbeam kanallarını incelediniz:
- Bunlar mpmc'dir: hem göndericiler hem de alıcılar klonlanabilir.
unbounded()vebounded(n), arabelleğe almayı ve geri basıncı kontrol eder.select!,afteraracılığıyla zaman aşımları vetickaracılığıyla periyodik işlemlerle birlikte birden çok kanalı bekler.try_send/try_recvengellemesizdir.- Çalışan havuzları ve karmaşık pipeline yapıları için crossbeam'i; basit borular için std mpsc'yi kullanın.
Yapay zeka eğitmeniyle Rust öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 39
- Dersler
- 144
Sıkça Sorulan Sorular
“Crossbeam Kanalları” dersi ücretsiz mi?
Evet — “Crossbeam Kanalları” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Learn Rust Coding kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Learn Rust Coding kursu toplamda 4 dersten oluşur.
“Crossbeam Kanalları” dersinde ne öğreneceğim?
Gelişmiş kanallar Learn Rust Coding ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Learn Rust Coding öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Learn Rust Coding, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Crossbeam Kanalları” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Learn Rust Coding dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Learn Rust Coding dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- mpsc Kanalları
- Durumu Arc/Mutex ile Paylaşma
- Kapsamlı İş Parçacıkları
- Crossbeam Kanalları