Node.js single threadmi yoki multi thread? (intervyu savoli)

Assalamu Alaykum bugun Nodejs single or multi threadligi haqida gaplashamiz. Bu ko'p intervyularda so'raladi va maqoladagi hamma narsalar to'g'ri bo'lmasligi mumkin (tushunishlarim natijasida yozilgan xatolar topsangiz murojaat qiling). Qani boshladik unda.

Unda boshidan boshlaymiz yani Javascriptdan u nima uchun yaratilgan va ishlatilgan , keyin Nodejs va uning ichki qismlariga o'tamiz.

Intro

JavaScript

Javascript browserlar uchun oddiy skripting til sifatida yaratilgan , u bitta threadlik muhit uchun moslangan ( istalgan bir vaqtda faqatgina bitta task amalga oshiriladi) . Bu web sahifalardagi click va animatsiyalar uchun yetarli edi.

NodeJs

Nodejs 2009 yilda yaratilgandan so'ng , U JavaScript tilini server tomonga ham olib kirdi , uning yordamida kengayadigan backend sistemalar qurish mumkin bo'ldi . Nodejs bu shunchaki run time environment ya’ni, kompyuterga javascript kodini tushunish va ishlatishga yordam beradi. U oldin ham ishlardi desangiz , javascript oldin faqatgina browser tomonidan tushunilgan o'zining engine (V8)lar orqali. Nodejs xuddi shu engine V8ni olib unga ba'zi o'zgartirishlar kiritgan holda (file system, network va boshqalar) Javascriptni server tomonda ishlatishga imkon berdi.

Single Thread: JavaScript Execution

NodeJs core qismida Javascript kodni bitta asosiy( main) threadda ishga tushuradi. U event loop bilan boshqariladi , event loop callbacklar ishga tushishiga , promise va funksiyalar navbat bilan ishlashiga javobgar.

Bu model Nodejsni osonroq qiladi chunki:

Ammo bu Nodejs bitta thread bilan cheklanib qoldi degani emas.

Event Loop

Event loop bu Nodejsni dasturlarini ishlab turishini taminaydigan asosiy mexanizm. U doimiy vazifalarni tekshiradi, ularni ishga tushuradi, yoki os tomonidan tugatilishini kutib turadi.

U qanday ishlaydi:

  1. Call Stack — JavaScriptning sinxron kodlari ishga tushadigan joy .

  2. Event Queue — bu asinxron operatsiylarning callbacklari kutadigan joy (timers, I/O, promises).

  3. Event Loop — bu manager qachonki call stack bo'sh bo'lsa Event Queuedan vazifalarni olib stackga run qilish uchun beradi.

Bu event loop modeli Nodejsga bir vaqtda minglab concurrent so'rovlarni bilan ishlashga yordam beradi.

Event loop phase bir necha qismlardan tashkil topgan buni keyingi maqolalarda batafsil ko'rib chiqamiz.

libuv: Parda ortidagi ishchi

Nodejs juda ko'p ishlarda libuvga tayanadi , libuv bu C kutubxonasi bo'lib asinxron I/O modelda ishlaydi. Nodejs Libuv 2 ta muhim ishni qiladi:

  1. Event Loop ni ishga tushuradi— asinxron vazifalarni boshqaradigan mexanizm.

  2. Thread Poolni boshqaradi — bir nechta worker threadlar (default 4ta) yaratib , ularni og'ir I/O opertsiyalar uchun ishlatadi.

Thread pool tomonidan bajariladigan operatsiyalar:

Xo'sh Javascript kodi bitta threadda ishga tushgani bilan, libuv vazifalarni bir nechta threadga olib bo'lib tashlaydi , bu Nodejs oson scale bo'lishiga yordam beradi.

Thread Pool

Default, libuv bizga 4ta threadga ega pool yaratadi , ammo bu environment variable UVTHREADPOOLSIZE (up to 128) orqali o'zgartirish mumkin.

Misol:

const fs = require("fs");

for (let i = 0; i < 10; i++) {
  fs.readFile(__filename, () => {
    console.log("File read complete", i);
  });
}

Javascript single thread bo'lgani bilan, libuv bu file o'qishlarni bir necha threadlarga bo'lib tashlaydi.

Child Processes va Clustering

Ba’zan sizga haqiqatdan ham CPU corelar bo'ylab parallelismkerak . Nodejs process bitta coreda ishga tushganligi tufayli , quyidagilarni taklif qiladi :

  1. Child Processes — Bu orqali yangi process yaratib unga IPC (inter-process communication) communication orqali bog'lanishingiz mumkin.

  2. Clustering — bu built-in modul bolib bir necha worker process yaratish orqali , kelayotgan so'rovlar bosimini taqsimlay olqadi .

Bu orqali Nodejs hamma CPU corelarga scale qila oladi.

Child Processes va Clustering haqida keyingi maqolalarda yoritamiz.

Worker Threads

Worker threads Node.js ning 10 versiyasida qo'shilgan, va bu modul orqali Javascript kod uchun haqiqiy multithreading qilish mumkin.Clusterdan farqli , worker threads bir biri bilan xotira ulashadi ('SharedArrayBuffer') va processdan yengilroq .

Ular CPU intensive vazifalar uchun ideal , masalan :

Process va thread haqida to'liq bilmoqchi bo'lsangiz ushbu maqolamni o'qing.Process va thread nima farqi bor ?

Xo'sh, Node.js Single-Thread yoki Multithread?

Javob sizni qarashingizga bog'liq:

1.Single-threaded (JavaScript execution):

Asosiy (main) thread event loopdan foydalangan holda Javascript kodni ishga tushuradi .

Bu agarda siz nodejsni ishga tushursangiz masalan foo.js faylni run qildingiz va u Nodejs process hamda u uchun ishlaydigan thread(main) yaratadi.

2.Multithreaded (under the hood):

Xo'sh nodeni ishga tushurdik u process yaratadi hamda o'zi uchun thread ochdi ammo biz V8ga bog'langan C++ funksiyalari orqali OS ga chiqishimiz mumkin va operatsion sistema 1 ta thread bilan cheklanmagan.

Misol

Masalan siz serverga 2 ta so'rov yubordingiz bu so'rovlar asinxron ishlaydi .Bu degani nodejs 2-so'rovni eshitishni boshlashi uchun 1-so'rovni tugatishga majbur emas. Va core 1 V8 ishlashi uchun masul ammo bu holatda haqiqiy ish os levelda amalga oshmoqda .Event loop yordami bilan biz Nodejs single thread bo'lgan holda ham bir necha so'rovlarni bemalol qabul qila olamiz.

Agarda siz asinxron kod yozsangiz u event loopga event qo'shib va o'zi pastgi levelga tushib ketadi .

Note: V8 va Event loop bitta threadda ishga tushadi (Main thread)

Xulosa

Qisqa qilib aytadigan bo'lsak Nodejs javascript kodni bitta threadda ishga tushuradi ammo I/O, sistema operatsiylari uchun bir nechta threadlar ishlatadi hamda worker threads orqali haqiqiy multi threading qilishi mumkin. Nodejs Javascript run qilish bo'yicha single thread ammo,arxitektura bo'yicha ko'rilsa multithread hisoblanadi .

Agarda maqola yoqqan bo'lsa chapak chaling (ko'p chalsayam bo'ladi :). Obuna bo'lishni unutmang ;)

Xato va kamchiliklar uchun uzr !!!

linkedin.com =>Ulug’bek Habibov | LinkedIn

telegram channel =>@habibov_ulugbek