Skip to content

Commit 12671e9

Browse files
committed
Started to a new chapter about channels
1 parent 3e73d92 commit 12671e9

File tree

5 files changed

+65
-2
lines changed

5 files changed

+65
-2
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
[workspace]
2-
members = ["Lesson_00", "Lesson_01", "Lesson_02", "Lesson_03", "Lesson_04", "Lesson_05", "Lesson_06", "Lesson_07", "Lesson_08", "Lesson_09", "Lesson_10", "Lesson_11", "collector", "drone-lab", "fops", "mocking", "router", "sysco", "sysco2"]
2+
members = ["Lesson_00", "Lesson_01", "Lesson_02", "Lesson_03", "Lesson_04", "Lesson_05", "Lesson_06", "Lesson_07", "Lesson_08", "Lesson_09", "Lesson_10", "Lesson_11", "Lesson_12", "collector", "drone-lab", "fops", "mocking", "router", "sysco", "sysco2"]
33

44
resolver = "2"

Lesson_12/Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[package]
2+
name = "Lesson_12"
3+
version = "0.1.0"
4+
edition = "2024"
5+
6+
[dependencies]

Lesson_12/README.MD

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Ders 12: Channels
2+
3+
Bazı durumlarda thread'ler arasında veri aktarımı gerekebilir. Channel enstrümanı farklı thread'ler arasında veri taşınması için kullanılmaktadır. Rust standart kütüphanesi varsayılan olarak **Multi Producer - Single Consumer** türünü destekler. Farklı senaryolar için tokio, crossbeam gibi küfelerden de yararlanılabilir. **MPSC** senaryosunda producer yani veri yayımını gerçekleştiren n sayıda iş parçacığı varken tek bir tüketici ya da dinleyici söz konusudur. Kanallar aşağıdaki gibi senaryolarda sıklıkla tercih edilir;
4+
5+
- Görev _(task)_ sonuçlarının ana bir thread içerisine toplanması
6+
- HTTP isteklerinin paralel olarak işlenmesi
7+
- Sistemde gerçekleşen olayların ana bir döngüye yönlendirilmesi
8+
- GUI _(Graphic User Interface)_ olaylarının merkezi bir yürütücüye aktarılması
9+
- Okuma → işleme → yazma akışının parçalanarak thread’lere dağıtılması
10+
- Merkezi log toplayıcı yapılar
11+
12+
Kanallarda sahiplik _(Ownership)_ kurallarına uygunluk vardır. Veri gönderildiğinde, alıcı taraf bunu recv() veya iter() fonksiyonları ile alır. Sahiplik göndericiden devralınır. Asenkron ve senkron uyarlamaları yazmak mümkündür. **Tokio** veya **async-std** gibi asenkron çalışma ortamları için defacto haline gelmiş olan **tokio::sync::mpsc** küfesi kullanılır. Performans gereksinimi olan durumlarda ise **crossbeam-channel** tercih edilebilir.
13+
14+
## Temel Kullanım
15+
16+
Kanal kullanımını en basit haliyle aşağıdaki gibi ele alabiliriz.
17+
18+
```rust
19+
use std::sync::mpsc::channel;
20+
use std::thread;
21+
22+
fn main() {
23+
hello_channels();
24+
}
25+
26+
pub fn hello_channels() {
27+
let (transmitter, reciever) = channel();
28+
let message = String::from("Sample content");
29+
30+
thread::spawn(move || {
31+
transmitter.send(message).unwrap();
32+
});
33+
34+
let data = reciever.recv().unwrap();
35+
println!("{}", data);
36+
}
37+
```
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.

Lesson_12/src/main.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
use std::sync::mpsc::channel;
2+
use std::thread;
3+
4+
fn main() {
5+
hello_channels();
6+
}
7+
8+
pub fn hello_channels() {
9+
let (transmitter, reciever) = channel();
10+
let message = String::from("Sample content");
11+
12+
thread::spawn(move || {
13+
transmitter.send(message).unwrap();
14+
});
15+
16+
let data = reciever.recv().unwrap();
17+
println!("{}", data);
18+
}

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ yer aldığı repodur.
1818
- [Ders 09 - Closures](./Lesson_09/README.md)
1919
- [Ders 10 - Smart Pointers](./Lesson_10/Readme.md)
2020
- [Ders 11 - Threads](./Lesson_11/README.md)
21-
- [Ders 12 - Channels]()
21+
- [Ders 12 - Channels](./Lesson_12/README.md)
2222
- [Ders 13 - Macros]()
2323
- [Destekleyici Bölümler]()
2424
- [Birim Test](UnitTests.md)

0 commit comments

Comments
 (0)