Skip to content

Commit d5cafed

Browse files
committed
Initiated a new chapter
1 parent 5f4ce74 commit d5cafed

File tree

5 files changed

+129
-1
lines changed

5 files changed

+129
-1
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", "Lesson_12", "Lesson_13", "collector", "drone-lab", "fops", "game-engine", "mocking", "procs", "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", "Lesson_13", "Lesson_14", "collector", "drone-lab", "fops", "game-engine", "mocking", "procs", "router", "sysco", "sysco2"]
33

44
resolver = "2"

Lesson_14/Cargo.toml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[package]
2+
name = "Lesson_14"
3+
version = "0.1.0"
4+
edition = "2024"
5+
6+
[dependencies]
7+
tokio = { version = "1.45.0", features = ["full"] }
8+
rand = "0.9.1"

Lesson_14/README.md

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# Ders 14: Asenkron Programlama
2+
3+
Rust eşzamanlı _(concurrent)_ programlama haricinde asenkron programlamayı da destekler. Asenkron programlama özellikle
4+
dosya I/O işlemleri, network operasyonları, zaman bazlı görevler _(scheduled tasks)_ ve servis iletişimi gibi beklemeye
5+
neden olan süreçlerde CPU'nun idle kalmak yerine bahsedilen operasyonları icra etmesi için kullanılan bir yaklaşımdır.
6+
Rust bu ihtiyaca async ve await anahtar kelimeleri ile cevap verir. Rust tarafında asenkron programlama süreçleri
7+
genellikle defacto hale gelmiş çeşitli küfeler _(crates)_ ile sağlanır. Tokio küfesi bunlar arasında en popüler
8+
olanlarındandır. Bunun sebebi async fn çağrıları sonucu dönen Future nesnelerini yönetecek hazır bir ortamın built-in
9+
olarak gelmemesidir.
10+
11+
## Thread vs Async/Await
12+
13+
Thread ve async/await kullanımları sıklıkla birbirlerine karıştırılır. Her iki enstrüman arasındaki farklılıklar
14+
aşağıdaki tabloda özetlenmiştir.
15+
16+
| **Kriter** | **Thread** | **Async/Await** |
17+
|-----------------------|----------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|
18+
| **Paralellik** | Gerçek paralell çalışma ortamı söz konusudur _(çok çekirdek desteği)_ | Genellikle tek thread üzerinde iş birliği ile çalışır _(Bu bir çalışma zamanı da gerektirir, async-std, tokio gibi)_ |
19+
| **Kaynak Kullanımı** | Ağır _(her thread kendi stack alanını taşır ve bu varsayılan olarak 2Mbtır)_ Thread'ler Idle durumdayken bile enerji sarf ettirir. | Hafif _(runtime tarafından yönetilen task' lar söz konusudur)_ |
20+
| **Bloklama** | I/O seviyesinde bloklamalar varsa tüm thread'ler etkilenir. | I/O bloklama diğer görevleri etkilemez. |
21+
| **Ölçeklenebilirlik** | Thread sayısı fiziksel sınırlamalara bağlıdır _(Çekirdek sayısı gibi)_ Çok fazla thread açılması sistemde aşırı yüklenmelere neden olabilir. | Binlerce asenkron görev oluşturulabilir. |
22+
| **Kod Karmaşıklığı** | Göreceli bir durumdur, nispeten basittir. | Hata ve bağımlılıkların yönetimi karmaşık olabilir. |
23+
| **Senaryolar** | İşlemci yoğun/öncelikli işler için uygundur. | Daha çok I/O yoğun işler için uygundur. |
24+
| **Ne zaman?** | CPU yoğun işlerde _(Ağır matematiksel hesaplamalar)_, her görevin tam bağımsız ve paralel çalışması gerektiği durumlar | Web istekleri, dosya erişimleri gibi I/O yoğun işler, yüksek ölçeklenebilirlik gerektiren hafif işler, enerji ve kaynak tasarrufunun önemli olduğu durumlar |
25+
26+
## Örnekler
27+
28+
Asenkron programlama konseptini anlamanın en iyi yolu gerçek hayat örnekleri üzerinden ilerlemektir. Bir sunucudaki
29+
işlemci, bellek ve disk kullanım durumlarını anlık olarak takip eden bir sistem programı geliştirmek istediğimizi
30+
düşünelim. Burada donanım bazında çalışan fonksiyonellikler olduğunu ifade edebiliriz. Senkron bir okuma yerine asenkron
31+
olarak bu değerlerin okunması sağlanabilir. Aşağıdaki örnek kod parçasında bu durumu tokio küfesi kullanılarak simüle
32+
edilmektedir.
33+
34+
```rust
35+
use rand::Rng;
36+
use std::time::Duration;
37+
use tokio::sync::mpsc;
38+
use tokio::task;
39+
use tokio::time::sleep;
40+
#[tokio::main]
41+
async fn main() {
42+
let (log_transmitter, mut log_receiver) = mpsc::channel(100);
43+
44+
let cpu_task = task::spawn(fetch_metrics("CPU Service", log_transmitter.clone()));
45+
let memory_task = task::spawn(fetch_metrics("Memory Service", log_transmitter.clone()));
46+
let disk_task = task::spawn(fetch_metrics("Disk Service", log_transmitter));
47+
48+
let logger_task = task::spawn(async move {
49+
while let Some(metric) = log_receiver.recv().await {
50+
println!("LOG: {}", metric);
51+
}
52+
});
53+
54+
let _ = tokio::join!(cpu_task, memory_task, disk_task, logger_task);
55+
}
56+
57+
async fn fetch_metrics(service_name: &str, tx: mpsc::Sender<String>) {
58+
let interval = Duration::from_secs(5);
59+
for i in 1..=10 {
60+
let metric = format!("{} - Metric {}: {}", service_name, i, get_metric());
61+
if tx.send(metric).await.is_err() {
62+
println!("{}: Channel isn't active!", service_name);
63+
break;
64+
}
65+
sleep(interval).await;
66+
}
67+
}
68+
69+
fn get_metric() -> f64 {
70+
let mut rng = rand::rng();
71+
rng.random_range(50.0..100.0)
72+
}
73+
```
74+
75+
Örnek kod sembolik olarak işlemci, bellek ve disk kullanım oranlarını takip eden fonksiyonellikleri ele alır.
76+
fetch_metrics metodu asenkron olarak çağırabilen bir fonksiyondur. async keyword bu nedenle kullanılmıştır. Sistemde log
77+
mesajlarının üretimi ve yakalanması bir kanal üzerinden gerçekleştirilir. Örnekte dikkat edileceği üzere tokio küfesi
78+
kullanılmıştır. Main metodu da async keyword ile imzalanmıştır. Program beş saniyede bir işlemci, bellek ve disk
79+
kullanımları ile ilgili bilgi alıp ekrana yazdırır.
80+
81+
// YENİ ÖRNEKLER EKLENECEK

Lesson_14/src/main.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
use rand::Rng;
2+
use std::time::Duration;
3+
use tokio::sync::mpsc;
4+
use tokio::task;
5+
use tokio::time::sleep;
6+
#[tokio::main]
7+
async fn main() {
8+
let (log_transmitter, mut log_receiver) = mpsc::channel(100);
9+
10+
let cpu_task = task::spawn(fetch_metrics("CPU Service", log_transmitter.clone()));
11+
let memory_task = task::spawn(fetch_metrics("Memory Service", log_transmitter.clone()));
12+
let disk_task = task::spawn(fetch_metrics("Disk Service", log_transmitter));
13+
14+
let logger_task = task::spawn(async move {
15+
while let Some(metric) = log_receiver.recv().await {
16+
println!("LOG: {}", metric);
17+
}
18+
});
19+
20+
let _ = tokio::join!(cpu_task, memory_task, disk_task, logger_task);
21+
}
22+
23+
async fn fetch_metrics(service_name: &str, tx: mpsc::Sender<String>) {
24+
let interval = Duration::from_secs(5);
25+
for i in 1..=10 {
26+
let metric = format!("{} - Metric {}: {}", service_name, i, get_metric());
27+
if tx.send(metric).await.is_err() {
28+
println!("{}: Channel isn't active!", service_name);
29+
break;
30+
}
31+
sleep(interval).await;
32+
}
33+
}
34+
35+
fn get_metric() -> f64 {
36+
let mut rng = rand::rng();
37+
rng.random_range(50.0..100.0)
38+
}

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ yer aldığı repodur.
2020
- [Ders 11 - Threads](./Lesson_11/README.md)
2121
- [Ders 12 - Channels](./Lesson_12/README.md)
2222
- [Ders 13 - Macros](./Lesson_13/README.md)
23+
- [Ders 14 - Asenkron Programlama](./Lesson_14/README.md)
2324
- [Destekleyici Bölümler]()
2425
- [Birim Test](UnitTests.md)
2526
- [Hata Yönetimi](ErrorHandling.md)

0 commit comments

Comments
 (0)