@@ -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