Herkese merhaba,
Bu ilk yazımda Javascript'i gerçekten anlamak isteyenlerin kafa yorduğu konulardan biri olan Event Loop(main loop, main thread, event thread,vb...) hakkında yazacağım. Şunuda eklemek istiyorum bu yazı profesyonel şekilde değil, kendim için aldığım notların bir derlemesi niteliğinde olacak. Hatalarım için şimdiden özür dilerim.
Aşağıdaki görselde nodejs içerisinde bulunan javascript v8 engine, event loop mekanizması ve libuv kütüphanesini görüyorsunuz. Javascript' in sağlayamadığı bir takım işleri yürüten libuv kütüphanesidir. Tarayıcıda javascript çalıştırırsak burada tarayıcıların sunduğu web api ile işleri yürütürüz.
Event loop bir mimari dizayn modelidir(architectural design pattern). Bu yaklaşımın tercih edilme sebebi javascriptin çalışma prensibiyle doğrudan alakalıdır. Javascript single threaded ve Non-Blocking I/O çalışır. Yani tek bir iş parçacığı üzerinde çalışmasına rağmen vakit alan işleri yürütürken bloklanmaz, çalışmaya devam eder. Bunu event loop mimarisiyle çözümler.
Program çalıştırıldığında Global Execution Context oluşturulur ve call stack'e eklenir. Bu program akışı tamamlanana kadar call stack'ten kaldırılmaz. Aslında her bir fonsksiyon için bir execution context oluşturulur. Fonksiyon işlevi tamamlandığında call stack'ten kaldırılır. Ama her zaman bu şekilde çalışmaz.
Bazı durumlarda fonksiyon işlevini tamamlaması zaman alır. Örneğin bir ağ isteği veya bir dosyadan veri okuma-yazma işlemi, DOM olayları (tamamı değil) gibi. Bu durumda fonksiyon thread pool veya Web API' lar tarafından işleme alınır. İşlem bittiğinda callback fonksiyonu callback queue (task queue) eklenir. Sırası geldiğinde(call stack boşaltıldığında) call stack'e aktarılır ve işlenir. İşlendikten sonra call stack'ten kaldırılır. Microtask queue' daki işler, callback queue' dakilerden önce işlenir. Bunlara örnek Promise, Mutation Observer, queueMicrotask
Node.js içinde thread pool, tarayıcılar içinde Web Workers asenkron işlemleri, yoğun CPU gücü gerektiren işleri yürütmek için kullanılır. Kullanımda ve kapsamlarında farklılıklarına burada değinmeyeceğim. Anlatmak istediğim şudur ki; javascript ile üstesinden gelemediğimiz işleri farklı mekanizmalar ile üstesinden gelebilir hale getiriyoruz.
Top comments (0)