Türkiye'de ilk Mobil & PC Aynı Anda Metin2 Oyna. Triarchonline kalıcı ve uzun ömürlü yapısı ile 24 Temmuz'da açılıyor. | 1-99 Mobil Metin2 Triarch HEMEN TIKLA!
[NODE JS] Senkron vs Asenkron Dosya Islemleri
Herkese merhaba, bugun Node.js'te dosya islemlerinin iki farkli yaklasimini karsilastiracagiz: senkron ve asenkron. Bu konu baslangicta basit gibi gorunse de aslinda Node.js'in temel felsefesini anlamak icin cok onemli bir konu. Ben kariyerimde bu konuyu yanlis anlayan bir cok gelistirici gordum ve production'da ciddi performans sorunlari yasadilar.
Senkron Islemler Nedir?
Senkron islemler, bir islemi baslatip tamamlanmasini bekleyen islemlerdir. Yani bir dosya okuma islemi baslattiginizda, dosya tamamen okunana kadar programiniz baska hicbir is yapmaz. Node.js'te senkron dosya islemleri Sync son ekiyle biter: readFileSync, writeFileSync, mkdirSync gibi. Bu fonksiyonlar cagrildiginda event loop bloklanir ve diger tum islemler durur. Bu da demek oluyor ki sunucunuz o sirada gelen hicbir istege cevap veremez.
Peki o zaman neden var bu fonksiyonlar? Cunku bazi durumlarda senkron islemler gayet mantikli. Mesela uygulama baslarken config dosyasini okumak, CLI araclari yazmak veya script'lerde kullanmak gibi durumlarda senkron islemler hem daha basit hem de daha anlasilir kod yazmanizi saglar. Ben mesela bir CLI araci yazarken hep senkron fonksiyonlari tercih ediyorum cunku zaten tek bir kullanici var ve paralel islem yapma ihtiyaci yok.
Asenkron Islemler Nedir?
Asenkron islemler ise bir islemi baslatip sonucunu beklemeden diger islemlere devam etmenizi saglar. Islem tamamlandiginda bir callback cagirilir veya bir Promise resolve edilir. Node.js'in gucunun buyuk bolumu bu asenkron yapidan gelir. Bir web sunucusu dusunun, ayni anda yuzlerce istek geliyor. Eger her dosya okuma isleminde sunucu bloklanirsa, diger tum kullanicilar beklemek zorunda kalir. Ama asenkron calistiginda, bir dosya okunurken diger isteklere de cevap verebilirsiniz.
JavaScript:
const fs = require('fs');
const fsPromises = require('fs/promises');
const path = require('path');
// ===== SENKRON YAKLASIM =====
console.log('--- Senkron Islemler ---');
console.log('Islem 1: Basladi');
try {
// Bu satir tamamlanana kadar program bekler
const veri = fs.readFileSync(
path.join(__dirname, 'config.json'),
'utf8'
);
console.log('Dosya okundu, uzunluk:', veri.length);
} catch (error) {
console.error('Okuma hatasi:', error.message);
}
console.log('Islem 2: Bu satir dosya okuma bittikten sonra calisir');
// ===== ASENKRON YAKLASIM (Callback) =====
console.log('\n--- Asenkron Islemler (Callback) ---');
console.log('Islem 1: Basladi');
fs.readFile(
path.join(__dirname, 'config.json'),
'utf8',
(error, veri) => {
if (error) {
console.error('Okuma hatasi:', error.message);
return;
}
console.log('Dosya okundu, uzunluk:', veri.length);
}
);
// Bu satir dosya okunmadan ONCE calisir!
console.log('Islem 2: Bu satir dosya okuma BITMEDEN calisir');
// ===== ASENKRON YAKLASIM (Promise + async/await) =====
async function modernYaklasim() {
console.log('\n--- Asenkron Islemler (async/await) ---');
console.log('Islem 1: Basladi');
try {
const veri = await fsPromises.readFile(
path.join(__dirname, 'config.json'),
'utf8'
);
console.log('Dosya okundu, uzunluk:', veri.length);
} catch (error) {
console.error('Okuma hatasi:', error.message);
}
console.log('Islem 2: Bu satir okuma bittikten sonra calisir');
console.log('(ama event loop bloklanmadi!)');
}
modernYaklasim();
Performans Farki
Gelin somut bir ornekle performans farkini gorelim. Asagidaki kodda ayni islemi hem senkron hem asenkron olarak yapip sure farkini olcuyoruz. Senkron versiyonda her dosya teker teker okunur ve toplam sure tum dosya okuma surelerinin toplamidir. Asenkron versiyonda ise tum dosyalar ayni anda okunur ve toplam sure en yavas dosyanin okuma suresi kadardir. Bu fark ozellikle dosya sayisi arttikca dramatik sekilde buyur.
JavaScript:
const fs = require('fs');
const fsPromises = require('fs/promises');
const path = require('path');
const DOSYA_SAYISI = 10;
const testDosyalari = [];
// Test dosyalarini olustur
for (let i = 0; i < DOSYA_SAYISI; i++) {
const dosyaYolu = path.join(__dirname, `test_${i}.txt`);
fs.writeFileSync(dosyaYolu, 'X'.repeat(100000)); // 100KB'lik dosya
testDosyalari.push(dosyaYolu);
}
// Senkron okuma testi
function senkronOkuma() {
const baslangic = Date.now();
for (const dosya of testDosyalari) {
const veri = fs.readFileSync(dosya, 'utf8');
}
const sure = Date.now() - baslangic;
console.log(`Senkron okuma: ${sure}ms`);
return sure;
}
// Asenkron okuma testi (Promise.all ile paralel)
async function asenkronOkuma() {
const baslangic = Date.now();
const islemler = testDosyalari.map(dosya =>
fsPromises.readFile(dosya, 'utf8')
);
await Promise.all(islemler);
const sure = Date.now() - baslangic;
console.log(`Asenkron okuma: ${sure}ms`);
return sure;
}
// Karsilastirma
async function karsilastir() {
console.log(`${DOSYA_SAYISI} dosya okunuyor...\n`);
const senkronSure = senkronOkuma();
const asenkronSure = await asenkronOkuma();
console.log(`\nFark: ${senkronSure - asenkronSure}ms`);
console.log(`Asenkron ${(senkronSure / asenkronSure).toFixed(1)}x daha hizli`);
// Temizlik
for (const dosya of testDosyalari) {
fs.unlinkSync(dosya);
}
}
karsilastir().catch(console.error);
Ne Zaman Hangisini Kullanmaliyiz?
Benim tecrubeme gore su kurallari takip etmek en dogrusu: Uygulama baslangicindan (initialization) senkron kullanabilirsiniz, cunku henuz istek almiyorsunuz. HTTP handler icinde, middleware'lerde, route handler'larda kesinlikle asenkron kullanin. CLI araclari ve build script'lerinde senkron kullanmak sorun degil. Eger emin degilseniz, asenkron kullanin. Yanlis tercih yapmaktansa guvenli tarafta kalmak her zaman daha iyidir.
Ha bu arada sunu da belirteyim: async/await kullaniyor olmaniz kodunuzun asenkron calistigini garanti etmez. Eger async fonksiyon icinde readFileSync cagirirseniz, event loop yine bloklanir. async kelimesi sadece fonksiyonun Promise dondurdugu anlamina gelir, sihirli bir sekilde senkron kodu asenkron yapmaz. Bu cok yaygin bir yanlis anlama ve ben bunu duzeltmek icin cok ugrastim. Herneyse, bir sonraki yazida gorusuruz arkadaslar!
Emeğiniz ve katkınız için teşekkür ederiz!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar!

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 1
- Görüntüleme
- 36
- Cevaplar
- 3
- Görüntüleme
- 204
- Cevaplar
- 1
- Görüntüleme
- 522