capypad
0 Tage Serie
rust / intermediate
Snippet

Parallelprogrammierung mit Channels

Rusts std::sync::mpsc Channels ermöglichen sichere Thread-Kommunikation. mpsc steht für Multi-Producer, Single-Consumer. Die channel-Funktion erstellt ein Sender-Empfänger-Paar. send() überträgt Werte und gibt Result zurück, da der Channel getrennt sein könnte. recv() blockiert, bis eine Nachricht ankommt. Mehrere Producer können an denselben Channel senden, aber nur ein Consumer kann empfangen. Für mehrere Consumer müssten Sie den Empfänger klonen.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
use std::sync::mpsc;
use std::thread;
use std::time::Duration;
 
fn main() {
let (tx, rx) = mpsc::channel::<String>();
let (tx2, rx2) = mpsc::channel::<u32>();
 
let producer = thread::spawn(move || {
for i in 1..=5 {
let msg = format!("Message {}", i);
tx.send(msg).unwrap();
thread::sleep(Duration::from_millis(100));
}
});
 
let consumer = thread::spawn(move || {
for _ in 1..=5 {
if let Ok(msg) = rx2.recv_timeout(Duration::from_secs(1)) {
println!("Received number: {}", msg);
}
}
});
 
let _ = tx2.send(42);
drop(tx2);
 
producer.join().unwrap();
consumer.join().unwrap();
 
let (tx, rx) = mpsc::channel();
tx.send("Direct message").unwrap();
println!("Got: {}", rx.recv().unwrap());
}
Erklärung
1
let (tx, rx) = mpsc::channel::<String>();
Erstellt einen typisierten Channel; Sender (tx) und Empfänger (rx)
2
tx.send(msg).unwrap();
send gibt Result zurück, da Empfänger verworfen sein könnte
3
rx.recv_timeout(Duration::from_secs(1))
Wartet bis zu 1 Sekunde auf Nachricht; gibt Timeout zurück, falls keine ankommt
4
drop(tx2);
Schließen des Senders signalisiert Ende des Streams an Empfänger