Node.js Event Loop Mantığı
- 10
- (1)
- (5)
- 19 Oca 2025
Node.js'in en önemli özelliklerinden biri, asenkron ve tek iş parçacıklı (single-threaded) bir mimari kullanmasıdır. Bu yapı, Node.js'in yüksek performanslı ve ölçeklenebilir uygulamalar geliştirmek için tercih edilmesini sağlar. Bu makalede, Node.js'in "Event Loop" (Olay Döngüsü) mekanizmasının nasıl çalıştığını ve temel konseptlerini inceleyeceğiz.
Event Loop Nedir?
Event Loop, Node.js'in asenkron çalışmasını sağlayan mekanizmadır. Node.js, tek bir iş parçacığı kullanarak tüm I/O (Giriş/Çıkış) işlemlerini yönetir ve bloklamadan diğer işlemleri gerçekleştirebilir.
Temel İşleyiş:
- Node.js bir işlem aldığında, bloklanmasını önlemek için işlemi arka planda çalıştırır.
- İşlem tamamlandığında bir geri çağrım (callback) fonksiyonu kuyruğa eklenir.
- Event Loop, bu kuyruğa giren işlemleri sırayla yürütür.
Bu yapı sayesinde Node.js aynı anda binlerce isteği işleyebilir ve hızlı yanıt verebilir.
Event Loop Aşamaları
Event Loop, belirli aşamalardan oluşur. Her bir aşamada farklı türde işlemler gerçekleştirilir. Bu aşamalar şunlardır:
1. Timers (Zamanlayıcılar): setTimeout()
ve setInterval()
gibi zamanlayıcı fonksiyonların geri çağrımları bu aşamada yürütülür.
2. Pending Callbacks (Bekleyen Geri Çağırımlar): I/O işlemlerinin tamamlanmasını bekleyen geri çağırımlar burada yürütülür.
3. Idle, Prepare: Node.js'in iç mekanizması için kullanılan aşamalardır. Kullanıcı kodları bu aşamada çalışmaz.
4. Poll (Anket): Yeni gelen I/O olaylarını kontrol eder ve gerektiğinde yeni geri çağrımlar yürütür.
5. Check (Kontrol): setImmediate()
fonksiyonlarının geri çağrımları burada çalıştırılır.
6. Close Callbacks (Kapatma Geri Çağırımları): socket.on('close')
gibi kapanma işlemleri bu aşamada gerçekleştirilir.
Event Loop Çalışma Örneği
Aşağıdaki örnekle Event Loop'un nasıl çalıştığını görebilirsiniz:
console.log('Başlangıç');
setTimeout(() => {
console.log('setTimeout çağrıldı');
}, 0);
setImmediate(() => {
console.log('setImmediate çağrıldı');
});
console.log('Bitiş');
Çıktı şu şekilde olacaktır.
Başlangıç
Bitiş
setTimeout çağrıldı
setImmediate çağrıldı
Bu örnekten de görüldüğü gibi, Event Loop önce senkron kodları çalıştırır, ardından setImmediate
ve setTimeout
gibi asenkron işlemleri yürütür.
Mikro ve Makro Görevler
Mikro Görevler: process.nextTick()
ve Promise
geri çağrımları bu kategoriye girer ve her aşamadan önce yürütülür.
Makro Görevler: setTimeout()
ve setImmediate()
gibi zamanlayıcılar makro görevlerdir ve belirli aşamalarda çalıştırılır.
Örnek:
process.nextTick(() => console.log('nextTick'));
Promise.resolve().then(() => console.log('Promise'));
setTimeout(() => console.log('setTimeout'), 0);
Çıktı şu şekilde olacaktır.
nextTick
Promise
setTimeout
Event Loop Kullanım Alanları
Event Loop, aşağıdaki kullanım senaryolarında büyük avantajlar sağlar:
- Gerçek zamanlı uygulamalar (sohbet uygulamaları, oyunlar)
- Veritabanı işlemleri
- Dosya sistemi işlemleri
- API çağrıları ve entegrasyonlar
Node.js Event Loop, asenkron işlemleri yönetmek için kritik bir bileşendir. Tek iş parçacıklı yapısına rağmen Event Loop sayesinde yüksek performans elde edilir.
Node.js ile Ürün Yönetimi Uygulaması
Aşağıdaki kod, Event Loop'un çalışma prensibini göstermek amacıyla ürün yönetimi için basit bir API uygulaması oluşturur:
const http = require('http');
const url = require('url');
const nodemailer = require('nodemailer');
const requestHandler = (req, res) => {
const parsedUrl = url.parse(req.url, true);
res.writeHead(200, { 'Content-Type': 'text/plain' });
if (parsedUrl.pathname === '/insertProduct') {
res.end('Ürün eklendi');
} else if (parsedUrl.pathname === '/getProduct') {
res.end('Ürün detayları getirildi');
} else if (parsedUrl.pathname === '/listProduct') {
res.end('Ürün listesi getirildi');
} else if (parsedUrl.pathname === '/deleteProduct') {
res.end('Ürün silindi');
} else if (parsedUrl.pathname === '/updateProduct') {
res.end('Ürün güncellendi');
} else {
res.end('Geçersiz istek');
}
};
const server = http.createServer(requestHandler);
server.listen(3000, () => {
console.log('Ürün yönetimi sunucusu 3000 portunda çalışıyor');
});
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'your-email@gmail.com',
pass: 'your-password'
}
});
const sendProductListEmail = () => {
const mailOptions = {
from: 'your-email@gmail.com',
to: 'recipient-email@gmail.com',
subject: 'Ürün Listesi',
text: 'Ürün listesi burada yer almaktadır.'
};
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
console.log('Hata oluştu:', error);
} else {
console.log('E-posta gönderildi:', info.response);
}
});
};
setInterval(sendProductListEmail, 24 * 60 * 60 * 1000); // Her 24 saatte bir e-posta gönderir
- Kullanıcı belirtilen URL'lere istek yaptığında ilgili işlem gerçekleştirilir.
setInterval
fonksiyonu kullanılarak belirli aralıklarla ürün listesi e-posta olarak gönderilir.
İlişkili İçerikler
Node.js, JavaScript'i sunucu tarafında çalıştıran, ölçeklenebilir ve yüksek performanslı uygulamalar geliştirmek için kullanılan açık kaynaklı bir teknolojidir.