NodeJS Ad?m 4 – Asenkron Programlama

Ad?m Ad?m Nodejs yaz? dizimizin bir nceki blmnde I/O i?lemlerinden yani dosya okuma yazma i?lemlerinden bahsettik. Bu blmde senkron ve asenkron programlamay? anlataca??m.

Senkron Programlama

Yazd???m?z programlar?n o?u yazm?? oldu?umuz kodlar? yaz?l?? s?ras?na gre yukar?dan a?a??ya do?ru i?leyerek ilerler. Her ?ey s?ra ile yap?l?r. rne?in bir nceki blmde yazm?? oldu?umuz ?u kod buna bir rnektir:

var fs=require("fs");
var dosyaIcerigi=fs.readFileSync(process.argv[2]);
console.log(Program devam ediyor...);
var satirlar=dosyaIcerigi.toString().split("\n");
console.log(satirlar.length);

5 sat?rda s?ras?yla i?ler: fs modln a??r, dosya ieri?ini al, ekrana Program devam ediyor… yaz, sat?rlar? hesapla, sat?r say?s?n? ekrana yaz. Hibir i?lem birbirinin nne geemez. Ve birbirini beklemek zorundad?r. S?rayla, senkron bir ?ekilde i?lemek zorundad?r. Bu tip programlama metoduna Senkron Programlama denir.

Asenkron Programlama

Senkron programlamadaki her ?eyi s?rayla i?lemesi ve her bir i?lemin birbirini beklemesi yeri geldi?inde program?m?z? ok yava?latabilir, hatta i?lem bitene kadar durdurabilir. rne?in yukar?daki kodda 3. sat?r bir nceki sat?r? yani dosya okuma i?lemini beklemek zorundad?r. Dosya ieri?i ok bykse bu i?lemler dakikalar bile alabilir. Ekrana Program devam ediyor… yazd?rmak iin bir nceki i?lemin bitmesini beklemek pek ak?ll?ca de?il. ??te bu tip durumlar iin asenkron fonksiyonlar kullan?r?z. Kod ak???n?n s?rayla i?lemedi?i, i?lemlerin birbirini beklemedi?i, kod ak???n?n i?lem durumlar?na gre devam etti?i programlamaya Asenkron Programlama denir.

4-0-node-async

Asenkron i?lemler iin modller ierisinde asenkron fonksiyonlar vard?r. rne?in fs modl ierisinde kullanm?? oldu?umuz readFileSync metodunun asenkron versiyonu readFile metodudur. Yukar?daki rne?imiz bu metot ile yeniden yazal?m.

var fs=require("fs");
var dosyaIcerigi=fs.readFile(process.argv[2]);
console.log(Program devam ediyor...)
var satirlar=dosyaIcerigi.toString().split("\n");
console.log(satirlar.length);

 

4-1-node-async

Bu ?ekilde kodlar?m?z? asenkron yapm?? olduk. Art?k 2. sat?rdaki i?lem al???rken 3,4 ve 5 sat?rlar onun sonucunu beklemeden devam eder. Ancak yukar?daki kodlar?m?z hata verecek. Neden? nk biz 4. sat?rda 2. sat?rdaki kodun sonucunu kullan?yoruz. Ama daha 2. sat?rdaki kodun i?i bitmedi.(E?er okunan dosya ok ok kkse kk bir ihtimal bitmi? olabilir.) Peki biz ikinci sat?rdaki kodun i?inin bitti?ini nereden anlayaca??z? Bittikten sonra yapmam?z gerekenleri nerede belirtece?iz? Callback fonksiyonunda.

Callback fonksiyonu

Asenkron fonksiyonlar ierisindeki i?lemler bittikten hemen sonra yap?lacaklar?n belirlendi?i metotlara callback metotlar? denir. Bu metotlar asenkron metotlara parametre olarak verilir. Sadece bitiminde de?il herhangi bir hata sonucunda da callback fonksiyonlar? kullan?labilir. Bu tamamen asenkron metodun yap?s?yla alakal?d?r. Nodejs ierisindeki callback fonksiyonlar?nda genellikle en az iki tane parametre belirlenir. Biri hata durumunu kontrol etmek iin, di?eri fonksiyon sonucunu almak iin kullan?l?r. Callback fonksiyonunun ka tane parametre ald???n?, yap?s?n?n nas?l oldu?unu, hangisi s?ra ile yaz?laca??n? vs bilgileri kullanaca??m?z modl ve fonksiyonun dokmantasyonundan ?renebiliriz. Nodejs ierisindeki resmi modllerin dokmandasyonuna https://nodejs.org/en/docs/ adresinden kulland???n?z nodejs versiyonuna gre ula?abilirsiniz. rne?in fs modl ierisindeki readFile metodunun dokmantasyonuna buradan ula?abilirsiniz.

Gelelim kullan?m?na. Yukar?daki kodu ?u ?ekilde dzenliyoruz:

var fs=require("fs");

var callback1 = function (hata,dosyaIcerigi) {
if (hata) {
console.log("Bir hata olu?tu.")
return;
}
var satirlar=dosyaIcerigi.toString().split("\n");
console.log(satirlar.length);
}

fs.readFile(process.argv[2],callback1);
console.log("Program devam ediyor...");

4-2-node-async

Kodlar?m?za bakacak olursak callback1 ad?nda bir fonksiyon olu?turduk. Bu fonksiyon iki tane parametre al?yor. (Yap?s?n? tabiki dokmantasyondan ?rendik.) Bu fonksiyonu readFile fonksiyonuna parametre olarak verdik. readFile i?lemlerini yapt?ktan sonra bizim vermi? oldu?umuz callback1 fonksiyonunu ilk parametre olarak varsa hatay?, ikinci parametre olarak da hata olu?mam??sa sonucu parametre olarak verecek ve al??t?racak.

Kodumuza genel olarak tekrar bakarsak, ilk sat?rda fs modln a??rd?k. ikindi sat?rda parametre olarak yollad???m?z dosyan?n ieri?ini okumaya ba?lad?k. 2. Sat?rdaki kodumuz devam ederken 3. sat?rda ekrana Program devam ediyor yazd?k. Di?er taraftan 2. sat?rdaki kod ne zaman biterse callback1 fonksiyonunu a??racak. callback1 fonksiyonu ierisinde de ilk olarak hata olup olmad???n? kontrol ettik. Varsa konsol ekran?na Bir hata olu?tu. yazd?rd?k ve program? bitirdik. Yoksa devam edecek. Devam ederse dosyaIcerigi degiskenini string ifadeye evirip sat?rlar?na ay?rd?k. Daha sonrada sat?r say?s?n? ekrana yazd?rd?k. Genel olarak program?m?z bu ?ekilde i?liyor. Ayn? program? ?u ?ekilde de yazabiliriz:

var fs = require("fs");

fs.readFile(process.argv[2], function (hata, dosyaIcerigi) {
if (hata) {
console.log("Bir hata olu?tu.")
return;
}
var satirlar = dosyaIcerigi.toString().split("\n");
console.log(satirlar.length);
});

console.log("Program devam ediyor...");

nceki kod ile bu kod aras?nda hibir fark yok. Sadece yaz?m ?ekli farkl?. ?lkinde callback fonksiyonunu bir de?i?kene atay?p yle readFile fonksiyonuna ilettik. Di?erinde direkt ierisine yazd?k. Hangisi kolay?n?za geliyorsa kullanabilirsiniz. ?kisinin aras?ndaki fark? daha iyi anlamak iin iki kodu yan yana koyup inceleyebilirsiniz. Javascript ve nodejs dnyas?nda ikinci kullan?m daha yayg?nd?r. Kullanmasan?z bile kod okurken ikincisini anlamak faydal? olacakt?r.

Gelelim ikinci rne?imize. ?kinci bir rnek olarakta dosyan?n birinden okudu?umuz ieri?i ikinci bir dosyaya yazaca??z. Tabi iki dosya isminide parametre olarak alaca??z. Okuma i?lemi iin daha nce kulland???m?z fs modlnn readFile fonksiyonunu, yazma i?lemi iinde fs modlnn writeFile fonksiyonunu kullanaca??z. writeFile fonksiyonuda readFile gibi asenkron bir fonksiyon. (Daha nce kulland???m?z writeFileSync fonksiyonunun asenkron versiyonu.) Hem okuma hem yazma i?lemlerimiz asenkron olacak. Kodumuz ?yle:

 

var fs=require("fs");

var callback1 = function (hata,dosyaIcerigi) {
    if (hata) {
        console.log("Bir hata olu?tu.")
        return;
    }
    fs.writeFile(process.argv[3], dosyaIcerigi, callback2);
    console.log("Dosya okuma i?lemi bitti.");
}

var callback2=function (hata) {
    if (hata) {
        console.log("Bir hata olu?tu.")
        return;
    }
    console.log("Dosya yazma i?lemi bitti.")
}

fs.readFile(process.argv[2],callback1);
console.log("Program devam ediyor...");

4-3-node-async

Kodumuzun ne yapt???na bakal?m. ?lk olarak fs modln a??r?yoruz. Sonra callback1 ve callback2 ad?nda iki tane fonksiyon tan?ml?yoruz. Daha sonra (20. sat?rda) dosya okuma i?lemine ba?lan?r. Sonra ekrana Program devam ediyor… yazd?rd?k. Dosya okuma i?lemi bittikten sonra callback1 fonksiyonu al???r. callback1 ierisinde ncelikle hata kontrol yap?l?r. Hata yoksa writeFile fonksiyonu ile yazma i?lemine ba?lan?r. Sonras?nda konsol ekran?na Dosya okuma i?lemi bitti. yazd?r?l?r. Yazma i?lemi bittikten sonra ise callback2 fonksiyonu al???r. callback2 ierisinde de illk olarak hata kontrol yap?l?r. Daha sonra konsol ekran?na Dosya yazma i?lemi bitti. yazd?r?l?r. (writeFile fonksiyonunun herhangi bir dn? yok.) Daha sonra program?m?z sonlan?r. Yukar?daki kodu ?u ?ekildede yazabiliriz:

var fs=require("fs");

fs.readFile(process.argv[2],function (hata,dosyaIcerigi) {
    if (hata) {
        console.log("Bir hata olu?tu.")
        return;
    }
    fs.writeFile(process.argv[3], dosyaIcerigi, function (hata) {
        if (hata) {
            console.log("Bir hata olu?tu.")
            return;
        }
        console.log("Dosya yazma i?lemi bitti.")
    });
    console.log("Dosya okuma i?lemi bitti.");
});
console.log("Program devam ediyor...");

Bu ?ekilde kullan?m ok yayg?n. Ama i ie i ie ok fazla fonksiyon gelebilir ve kodun okunurlu?u ok d?ebilir. Bu tip durumlara Callback Hell yani Callback Cehennemi deniyor. Hangisi kolay?n?za geliyorsa kullanabilirsiniz.

?kinci rne?imizde de birden ok asenkron fonksiyonun ayn? program ierisinde kullan?m? grdk. Yine callback fonksiyonlar?n yada modl ierisindeki fonksiyonlar?n yap?s?n?n nas?l oldu?unu dkmantasyon zerinden ?rendik. Peki yazd???m?z kodlarda bize callback fonksiyonu yollanmas?n? nas?l sa?lar?z? Ve yollanan bu callback fonksiyonlar? nas?l kullan?l?r?

Bir sonraki blmde modler programlamay?, kendi modllerimi yazmay? ve kendi modllerimize callback fonksiyonlar? yollat?p onlar? kullanmay? grece?iz.

Makalede kullan?lan kodlara buradan ula?abilirsiniz.


[jetpack_subscription_form]

“NodeJS Ad?m 4 – Asenkron Programlama” için 4 yorum

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir