Event loop — hodisalar va tayyor vazifalarni navbatdan olib, ularning ishlov beruvchilarini ketma-ket ishga tushiradigan boshqaruv siklidir. U grafik interfeyslar, tarmoq serverlari va asinxron runtimelarda bitta yoki kam sonli oqim bilan ko‘plab bir vaqtdagi operatsiyani muvofiqlashtiradi. Event loop parallel bajarishni o‘zi yaratmaydi; u kutishni bloklamasdan rejalashtirish modelini beradi.
Siklning tarkibi
Runtimе odatda taymerlar, I/O tayyorligi, foydalanuvchi hodisalari va ichki vazifalar uchun navbat saqlaydi. Sikl tayyor manbalarni tekshiradi, mos callback yoki continuationni bajaradi, so‘ng navbatdagi hodisaga o‘tadi. Hech qanday ish tayyor bo‘lmasa, u CPUni behuda aylantirmasdan operatsion tizimning epoll, kqueue yoki IOCP kabi kutish mexanizmida to‘xtaydi.
JavaScript muhitida promise davomlari microtask navbatiga, taymer va I/O callbacklari boshqa navbatlarga tushishi mumkin. Microtasklar odatda navbatdagi tashqi hodisadan oldin bajariladi. Aniq ustuvorlik va bosqichlar runtimega bog‘liq, shuning uchun bir platformaning tartibini boshqasiga ko‘chirib talqin qilish xato bo‘lishi mumkin.
Bloklanmaslik talabi
Event loop oqimida uzoq CPU hisoblash, sinxron disk o‘qish yoki bloklovchi tarmoq chaqirig‘i bajarilsa, boshqa hodisalar kutib qoladi. Natijada bitta sekin callback barcha ulanishlar kechikishini oshiradi. CPU talab qiluvchi ish worker pool yoki alohida jarayonga uzatiladi; asinxron I/O esa natija tayyor bo‘lganda siklga xabar beradi.
Callback qisqa bo‘lishi uning umumiy ishini kichik degani emas. Minglab mayda microtasklar ham navbatni egallab, taymer va I/Oni och qoldirishi mumkin. Har bir bosqichda bajarish byudjeti, batch hajmi va backpressure hisobga olinadi. Katta oqimni bo‘lib ishlash siklga boshqa hodisalarga navbat berish imkonini beradi.
Xatolar va hayot sikli
Asinxron operatsiya muvaffaqiyat, xato, timeout yoki bekor qilish bilan tugaydi. Natijasi kuzatilmagan promise yoki callback istisnosi jim yo‘qolishi yoxud jarayon siyosatiga ko‘ra xizmatni to‘xtatishi mumkin. Resurs egasi socket, taymer va vazifalarni yopishda bekor qilishni tarqatadi. Jarayon yakunlanganda yangi ish qabul qilinmaydi, faol operatsiyalarga cheklangan vaqt beriladi.
Kuzatuv
Event loop lag taymerning rejalashtirilgan va haqiqiy bajarilish vaqti orasidagi farqni o‘lchaydi. Yuqori lag CPU bandligi, bloklovchi kod yoki juda uzun navbatni ko‘rsatishi mumkin. Navbat chuqurligi, callback davomiyligi, worker pool bandligi va I/O kechikishi bilan birga profil olinadi.
Event-driven arxitektura har vazifa uchun mos emas. Murakkab ketma-ket mantiq async/await bilan o‘qilishi osonlashtiriladi, ammo uning ostida event loop ishlashda davom etadi. Bir nechta CPU yadrosidan foydalanish uchun bir necha jarayon, worker yoki parallel runtime kerak bo‘ladi.
Timer va adolatlilik
Taymer belgilangan vaqtda aynan bajarilishini emas, o‘sha vaqtdan oldin bajarilmasligini odatda kafolatlaydi. Sikl band bo‘lsa callback kechroq ishlaydi. Periodik vazifani har safar “hozir + interval” bilan rejalash drift hosil qiladi; zarur bo‘lsa keyingi muddat boshlang‘ich jadvaldan hisoblanadi. Bir manba doim tayyor bo‘lib qolsa, boshqa navbatlarni och qoldirmaslik uchun runtime har aylanishda cheklangan batch oladi. Event loopga tegishli obyektni boshqa oqimdan bevosita o‘zgartirish o‘rniga thread-safe posting mexanizmi ishlatiladi. Aks holda siklning bir oqimli invariantlari buzilib, kam takrorlanadigan race condition paydo bo‘ladi.
Bog‘liq tushunchalar
Asinxron I/O, Callback, Promise, Microtask, Backpressure, Thread pool