Skip to content

Commit 9787649

Browse files
committed
Updated readme document
1 parent e9d63a9 commit 9787649

File tree

1 file changed

+68
-6
lines changed

1 file changed

+68
-6
lines changed

Lesson_14/README.md

Lines changed: 68 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,72 @@ fn get_metric() -> f64 {
7272
}
7373
```
7474

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.
75+
Örnek kod sembolik olarak işlemci, bellek ve disk kullanım oranlarını takip eden fonksiyonellikleri ele alır. Bu tip
76+
işlevler senkron çalışmak yerine eş zamanlı olarak işletilebilirler. task::spawn çağrısı bu görevleri başlatmak için
77+
kullanılır. fetch_metrics metodu **async** keyword'ü ile imzalandığından task::spawn tarafından kullanılabilir. tokio
78+
küfesinden gelen spawn metodunun tanımı aşağıdaki gibidir.
8079

81-
// YENİ ÖRNEKLER EKLENECEK
80+
```rust
81+
pub fn spawn<F>(future: F) -> JoinHandle<F::Output>
82+
where
83+
F: Future + Send + 'static,
84+
F::Output: Send + 'static,
85+
{}
86+
```
87+
88+
Dikkat edileceği üzere JoinHandle nesnesi Future ve Send trait'lerini implemente eden, statik yaşam ömrüne sahip bir
89+
enstrümandır. Future trait esasında poll tekniğine göre asenkron olarak başlatılan operasyon tamamlandığında devreye
90+
girileceğini ifade eder. Burada thread'ler arası haberleşme de söz konusudur ve unsafe olan Send trait bunu garanti
91+
eder. Kısacası elimizde asenkron olarak başlatılan operasyonlar ve bu operasyonlar tamamlandığında devreye giren, diğer
92+
thread'leri kesintiye uğratmayan Handler türleri vardır. Tüm JoinHandle nesnelerinin işlerinin tamamlanmasını beklemek
93+
için yine Join mekanizması kullanılır.
94+
95+
Örnekte kullanılan fetch_metrics fonksiyonu metrikler üretildikçe bu değerleri transmitter araclığı ile bir kanala
96+
bırakır. Kanala bırakılan bu bilgiler başka bir task içerisinden receiver nesnesi ile yakalanır ve terminale basılır.
97+
98+
Eş zamanlı görevlerin sık kullanıldığı bir başka senaryo ise, web servislerine gönderilen taleplerle ilgilidir.
99+
Aşağıdaki örnek kod parçasında bir web api hizmetine örnek talepler gönderilmekte ve bu talepler asenkron çalışan
100+
görevler içerisinde ele alınmaktadır.
101+
102+
```rust
103+
#[tokio::main]
104+
pub async fn main() {
105+
let task_a = task::spawn(fetch_data_async(
106+
"https://jsonplaceholder.typicode.com/posts/1",
107+
));
108+
let task_b = task::spawn(fetch_data_async(
109+
"https://jsonplaceholder.typicode.com/posts/2",
110+
));
111+
let task_c = task::spawn(fetch_data_async(
112+
"https://jsonplaceholder.typicode.com/posts/3",
113+
));
114+
115+
let (res_a, res_b, res_c) = tokio::join!(task_a, task_b, task_c);
116+
117+
match (res_a, res_b, res_c) {
118+
(Ok(a), Ok(b), Ok(c)) => {
119+
println!("{:?}", a);
120+
println!("{:?}", b);
121+
println!("{:?}", c);
122+
}
123+
_ => println!("Failed to fetch data"),
124+
}
125+
}
126+
127+
async fn fetch_data_async(url: &str) -> Result<String, reqwest::Error> {
128+
let response = reqwest::get(url).await?;
129+
response.text().await
130+
}
131+
```
132+
133+
Web Api türünden servisler HTTP protokolünün Get, Post, Put, Delete, Patch gibi metotlarını kullanan Restful mimariye
134+
göre tasarlanmış hizmetlerdir. Genellikle JSON türünden veriler kullanırlar. Örnekte kullanılan dummy servis ile olan
135+
iletişimi kolaylaştırmak için reqwest isimli bir küfe kullanılmıştır. task_a, task_b ve task_c nesneleri ile söz konusu
136+
servise üç ayrı talep yapılır. Tüm bu talepler fetch_data_async isimli asenkron fonksiyon tarafından eş zamanlı olarak
137+
ele alınır. Api servisinden HTTP Get metodu ile veri çekme işi reqwest'in get metodu ile gerçekleştirilir ki bu metot da
138+
asenkron olarak çağrılabilir. await çağrısı söz konusu fonksiyona ait Future'un bir sonuç elde edene kadar beklenmesini
139+
söyler ancak bu diğer thread'leri engelleyen bir durum değildir.
140+
141+
Servis haberleşmeleri ağ ortamlarında gerçekleşen süreçler olduğundan ana akışı bekletmeye neden olurlar. Cevap süreleri
142+
çok yüksek olsa dahi eş zamanlı olarak sayısız talebin ele alındığı durumlarda servis görevlerini asenkron başlatmak
143+
tercih edilen bir çözümdür. Bu mantık bir web sunucusu yazarken de geçerlidir.

0 commit comments

Comments
 (0)