Skip to content

Commit a9884d4

Browse files
committed
Updated readme document.
1 parent 12671e9 commit a9884d4

File tree

2 files changed

+78
-10
lines changed

2 files changed

+78
-10
lines changed

Lesson_12/README.MD

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,61 @@ pub fn hello_channels() {
3636
}
3737
```
3838

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+
use std::sync::mpsc::channel;
66+
use std::thread;
67+
use std::time::Duration;
68+
69+
fn main() {
70+
multi_producer();
71+
}
72+
73+
pub fn multi_producer() {
74+
let (transmitter, receiver) = channel();
75+
76+
for i in 0..10 {
77+
let transmitter_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+
for received in receiver {
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.

Lesson_12/src/main.rs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,29 @@
11
use std::sync::mpsc::channel;
22
use std::thread;
3+
use std::time::Duration;
34

45
fn main() {
5-
hello_channels();
6+
multi_producer();
67
}
78

8-
pub fn hello_channels() {
9-
let (transmitter, reciever) = channel();
10-
let message = String::from("Sample content");
9+
pub fn multi_producer() {
10+
let (transmitter, receiver) = channel();
1111

12-
thread::spawn(move || {
13-
transmitter.send(message).unwrap();
14-
});
12+
for i in 0..10 {
13+
let transmitter_clone = transmitter.clone();
14+
thread::spawn(move || {
15+
transmitter_clone
16+
.send(format!("Sending message is {}", i))
17+
.unwrap();
18+
thread::sleep(Duration::from_secs(2));
19+
});
20+
}
1521

16-
let data = reciever.recv().unwrap();
17-
println!("{}", data);
22+
drop(transmitter);
23+
24+
for received in receiver {
25+
println!("Incoming message is '{}'", received);
26+
}
27+
28+
println!("End of program");
1829
}

0 commit comments

Comments
 (0)