Ana içeriğe geç

Event Loop

Türkçe karşılığı
olay döngüsü
Okunuşu
ivent lup

Günlük kullanımda çoğunlukla İngilizcesi tercih edilir.

Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/event-loop

Kısaca

Event loop, olaylar ve I/O sonuçları hazır oldukça callback'leri tek tek çalıştırarak tek bir iş parçacığının birçok görevi yönetmesini sağlayan mekanizmadır.

Event loop nedir?

Event loop, bir çalışma ortamının sırada hangi kodun çalışacağına karar veren parçasıdır. JavaScript'te, hem tarayıcılarda hem Node.js'te, kodunuz tek bir ana iş parçacığında çalışır; yani aynı anda yalnızca bir JavaScript parçası yürütülür. Çalışma ortamı ağ istekleri, zamanlayıcılar ya da dosya okumaları gibi yavaş işlemleri beklemek yerine onları arka planda başlatır ve sonuç hazır olduğunda event loop ilgili callback'i çalıştırır.

Bir çağrı yığını (call stack) ve görev kuyruklarıyla birlikte çalışır. Çağrı yığını şu anda çalışan fonksiyonları tutar; boşaldığında event loop önce bekleyen her mikrogörevi (microtask) çalıştırır (çözülmüş promise callback'leri ve bir await'ten sonraki kod gibi), ardından bir sonraki görevi, yani bazen makrogörev (macrotask) denen, setTimeout callback'i ya da gelen bir ağ olayı gibi görevi alır. Node.js'te döngü, zamanlayıcılar, I/O callback'leri ve setImmediate için sabit aşamalardan geçer ve altta bekleme işini libuv adlı bir kütüphane yönetir.

Makarnayı kaynamaya bırakan, bir zamanlayıcı kuran ve beklerken sebze doğrayan, tencereye bakıp durmak yerine her zamanlayıcı çaldığında ona tepki veren tek bir aşçıyı düşünün. Bu tasarım, bir Node.js sunucusunun tek bir iş parçacığıyla binlerce eşzamanlı bağlantıyı yönetebilmesinin ve tarayıcıların veri beklerken duyarlı kalmasının nedenidir. Benzer döngüler Python'ın asyncio'suna, masaüstü GUI araç setlerine ve oyun motorlarına da güç verir.

Event loop çoğu zaman JavaScript'i paralel çalıştırıyormuş gibi yanlış anlaşılır. Sağladığı şey eşzamanlılıktır (concurrency), yani birçok görevin sırayla ilerlemesi; paralellik (parallelism) ise görevlerin farklı CPU çekirdeklerinde aynı anda çalışmasıdır. Devasa bir döngü ya da dev bir JSON dosyasını ayrıştırmak gibi uzun süren senkron bir görev döngüyü engeller; zamanlayıcılar geç tetiklenir ve sunucu bitene kadar yanıt vermeyi bırakır. Bu nedenle bu tür işler bölünmeli ya da worker thread'lere taşınmalıdır.

Bir bakışta

Event loop: çağrı yığınındaki kod yavaş işleri arka planda başlatır; biten callback'ler görev kuyruğunda, promise callback'leri mikrogörev kuyruğunda bekler ve yığın her boşaldığında döngü önce tüm mikrogörevleri, sonra sıradaki görevi çalıştırır.yavaş işi başlatırhazır olunca1 · tüm mikrogörevler2 · sonra tek bir görevyığın boşalıncaÇağrı yığınıcallback()Arka plan (Web API'leri)zamanlayıcılar, ağ istekleri, dosya okumaMikrogörev kuyruğupromise callback'leri, awaitGörev kuyruğusetTimeout, olaylarEvent loop
Tek iş parçacığı, aynı anda tek iş: döngü bir callback'i yalnızca yığın boşken verir ve mikrogörevler her zaman sıradaki görevden önce çalışır.

Önemli noktalar

  • Event loop, callback'leri tek bir iş parçacığında sırayla çalıştırır.
  • Yavaş I/O arka planda gerçekleşir; bu yüzden iş parçacığı beklemekle vakit kaybetmez.
  • Promise callback'leri gibi mikrogörevler, setTimeout callback'i gibi sonraki görevden önce çalışır.
  • Eşzamanlılık sağlar, paralellik sağlamaz.
  • Uzun süren senkron kod döngüyü engeller ve geri kalan her şeyi dondurur.

Örnek

Event loop'un kodu çalıştırma sırasıjavascript
console.log("1: synchronous code runs first");

setTimeout(() => console.log("4: timer callback (a task)"), 0);

Promise.resolve().then(() => console.log("3: promise callback (a microtask)"));

console.log("2: still synchronous");

// Output order: 1, 2, 3, 4
// Even a 0 ms timer waits until the call stack is empty
// and every pending microtask has run.

Sık sorulan sorular

JavaScript tek iş parçacıklı mıdır?

JavaScript kodu tek bir ana iş parçacığında çalışır ve üzerinde çalışan her şeyi event loop zamanlar. Çalışma ortamının kendisi ağ ve dosya I/O'su gibi işler için başka iş parçacıkları kullanır; tarayıcılarda web worker'larla, Node.js'te ise worker_threads ile daha fazlasını siz de oluşturabilirsiniz.

Mikrogörevler (microtask) ile makrogörevler (macrotask) arasındaki fark nedir?

Promise callback'leri ve queueMicrotask() gibi mikrogörevler, mevcut kod biter bitmez çalışır ve hepsi başka her şeyden önce çalışır. setTimeout, setInterval ve I/O callback'leri gibi makrogörevler ise mikrogörev kuyruğu boşaldıktan sonra event loop'un her turunda birer tane çalışır.

Event loop'u engellemek ne demektir?

Event loop'un gelen istekler, zamanlayıcılar veya tıklamalar gibi başka hiçbir şeyi işleyemeyeceği kadar uzun süren senkron kod çalıştırmak demektir. İşi daha küçük parçalara bölün, asenkron API'leri kullanın veya bir worker thread'e taşıyın.

İlgili sayfalar

Kaynaklar

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar