You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: Lesson_12/README.MD
+58-1Lines changed: 58 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -36,4 +36,61 @@ pub fn hello_channels() {
36
36
}
37
37
```
38
38
39
-
Bu örnekte spawn metodu ile açılan thread içerisinde message değişkeninin sahip olduğu veri ana thread'de receiver ile yakalanır ve ekrana basılır. channel çağrısı generic Sender ve Receiver veri yapılarının generic nesne örneklerini gönderir. Buna göre transmitter _(yani Sender)_ nesnesini kullanarak bir thread içerisinde kanala mesaj gönderimi sağlanabilir. Bu örnekte String türünden bir içerik gönderilmektedir. Receiver nesne örneğinin recv fonksiyonu ile de kanala bırakılan mesaj yakalanmaktadır.
39
+
Bu örnekte spawn metodu ile açılan thread içerisinde message değişkeninin sahip olduğu veri ana thread'de receiver ile yakalanır ve ekrana basılır. channel çağrısı generic Sender ve Receiver veri yapılarının generic nesne örneklerini gönderir. Buna göre transmitter _(yani Sender)_ nesnesini kullanarak bir thread içerisinde kanala mesaj gönderimi sağlanabilir. Bu örnekte String türünden bir içerik gönderilmektedir. Receiver nesne örneğinin recv fonksiyonu ile de kanala bırakılan mesaj yakalanmaktadır. recv fonksiyonu kanaldaki mesaj gelene kadar çalıştığı thread'i bekletir. Örnekte dikkat edilmesi gereken noktalardan birisi de message değişkenini kanala gönderdikten sonra yeniden kullanmaya çalışmaktır. Bu aşağıdaki hatanın oluşmasına sebebp olur.
40
+
41
+
```text
42
+
error[E0382]: borrow of moved value: `message`
43
+
--> Lesson_12/src/main.rs:17:28
44
+
|
45
+
| let message = String::from("Sample content");
46
+
| ------- move occurs because `message` has type `String`, which does not implement the `Copy` trait
47
+
|
48
+
| thread::spawn(move || {
49
+
| ------- value moved into closure here
50
+
| transmitter.send(message).unwrap();
51
+
| ------- variable moved due to use in closure
52
+
...
53
+
| println!("{},{}", data,message);
54
+
| ^^^^^^^ value borrowed here after move
55
+
|
56
+
```
57
+
58
+
Tabii bu durumda copy trait'i ile beslenen türler için söz konusu olmaz zira ilgili veriler kanala kopyalanarak taşınır.
59
+
60
+
## Multi-Producer Kullanımı
61
+
62
+
Aşağıdaki örnek kod parçasında ise birden fazla gönderici ele alınır.
63
+
64
+
```rust
65
+
usestd::sync::mpsc::channel;
66
+
usestd::thread;
67
+
usestd::time::Duration;
68
+
69
+
fnmain() {
70
+
multi_producer();
71
+
}
72
+
73
+
pubfnmulti_producer() {
74
+
let (transmitter, receiver) =channel();
75
+
76
+
foriin0..10 {
77
+
lettransmitter_clone=transmitter.clone();
78
+
thread::spawn(move|| {
79
+
transmitter_clone
80
+
.send(format!("Sending message is {}", i))
81
+
.unwrap();
82
+
thread::sleep(Duration::from_secs(2));
83
+
});
84
+
}
85
+
86
+
drop(transmitter);
87
+
88
+
forreceivedinreceiver {
89
+
println!("Incoming message is '{}'", received);
90
+
}
91
+
92
+
println!("End of program");
93
+
}
94
+
```
95
+
96
+
Bu örnekte 10 farklı **thread** kanala mesaj bırakır. Thread'ler **spawn** çağırısı ile ayağa kaldırılmadan önce **transmitter** nesnesinin bir klonunun oluşturulduğunda dikkat edilmelidir. Her bir **thread** kendi **transmitter** klonunu kullanarak kanala mesaj bırakır. Mesajlar kanala senkron sırada bırakılır. İlerleyen satırlarda bir **for** döngüsü ile kanala gelen mesajların **Receiver** nesnesi üzerinden yakalanması işlemi gerçekleştirilir. Dikkat edilmesi gereken noktalardan birisi de **drop** çağrısıdır. Açık bir şekilde **transmitter** nesnesi açıkça **drop** edilmiştir. Bu yapılmadığı durumda receiver dan mesajlar dinlenmeye devam eder ve program sonlanmaz. Bu bazı durumlarda zaten istenen bir durumdur. Sürekli dinlemede kalması gereken bir receiver gerektiren senaryolar buna örnek verilebilir.
0 commit comments