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.
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
Ö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,
setTimeoutcallback'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
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
- Node.jsBackend ve API'ler, s. 31Node.js, JavaScript'i tarayıcı dışında çalıştıran, en çok web sunucuları, API'ler ve komut satırı araçları için kullanılan açık kaynaklı çalışma ortamıdır.
- JavaScriptWeb Geliştirme, s. 25JavaScript, web tarayıcılarında sayfaları etkileşimli hale getiren ve Node.js gibi çalışma ortamlarıyla sunucularda da çalışan programlama dilidir.
- Async/AwaitProgramlamanın Temelleri, s. 2Async/await, asenkron kodu sıradan adım adım kod gibi okunur biçimde yazmayı sağlayan, her await'te bir promise ya da görev bitene dek duran sözdizimidir.
- PromiseProgramlamanın Temelleri, s. 46Promise, asenkron bir işlemin nihai sonucunu temsil eden bir nesnedir; iş bittiğinde kodun başarıya ya da hataya tepki vermesini sağlar.
- CallbackProgramlamanın Temelleri, s. 5Callback, başka bir fonksiyona argüman olarak verilen ve o fonksiyonun bir iş bittiğinde ya da bir olay gerçekleştiğinde sonradan çağırdığı fonksiyondur.
- EşzamanlılıkProgramlamanın Temelleri, s. 19Eşzamanlılık, bir programın birden çok görevde örtüşen zaman dilimlerinde ilerleyebilme yeteneğidir; örneğin birçok kullanıcıya aynı anda hizmet vermek gibi.
- Web WorkerWeb Geliştirme, s. 58Web worker, JavaScript'i bir arka plan iş parçacığında çalıştıran tarayıcı özelliğidir; böylece ağır hesaplamalar çalışırken sayfanın arayüzü donmaz.
Kaynaklar
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin