đ Single Threaded Execution (Node.js āĻ āĻā§āĻāĻžāĻŦā§ āĻāĻžāĻ āĻāϰā§):
- āĻĒā§āϰāĻĨāĻŽā§ āĻā§āĻĄ initialize āĻšā§āĨ¤
- Top-level āĻā§āĻĄ (main function-āĻāϰ āĻŦāĻžāĻāϰā§āϰ āĻā§āĻĄ) execute āĻšā§āĨ¤
- External module āĻā§āϞ⧠import āĻāϰāĻž āĻšā§āĨ¤
- Callback āĻŦāĻž Event āĻā§āϞ⧠register āĻāϰāĻž āĻšā§, āĻāĻŋāύā§āϤ⧠āϤāĻāύāĻ execute āĻšā§ āύāĻžāĨ¤
- āĻāϰāĻĒāϰ Event Loop āĻļā§āϰ⧠āĻšā§, āϝāĻž registered callback āĻā§āϞ⧠āĻĒāϰā§āϝāĻžā§āĻā§āϰāĻŽā§ execute āĻāϰā§āĨ¤
âī¸ āĻāĻŋāύā§āϤ⧠āϝāĻĻāĻŋ āĻā§āύ Callback āĻāĻžāϰ⧠āĻāĻžāĻ āĻšā§?
- āϝā§āĻŽāύ: File read, Crypto calculation, Image processingâĻ
- āϤāĻāύ Node.js āϏā§āĻ āĻāĻžāϰ⧠āĻāĻžāĻāĻā§āϞā§āĻā§ Thread Pool āĻ āĻĒāĻžāĻ āĻŋā§ā§ āĻĻā§ā§āĨ¤
- āĻāĻ Thread Pool āĻšāϞ⧠āĻāĻāĻā§āĻā§āĻ Worker Thread āϝā§āĻā§āϞ⧠āĻāĻ āĻāĻžāϰ⧠Task āĻā§āϞ⧠handle āĻāϰā§āĨ¤
- āĻāĻžāĻ āĻļā§āώ āĻšāϞ⧠āϤāĻžāϰāĻž Event Loop āĻā§ āĻāĻžāύāĻžā§, āϤāĻžāϰāĻĒāϰ Event Loop Output āĻĻā§āĻāĻžā§āĨ¤
đ¯ āϏāĻžāϰāĻžāĻāĻļ:
- Process-āĻāϰ āĻāĻŋāϤāϰ⧠āĻā§āĻ execution units āĻšāϞ⧠â Threads
- Node.js āĻ main thread āĻāĻāĻāĻžāĻ â Single Thread
- āĻāĻžāϰ⧠āĻāĻžāĻāĻā§āϞ⧠āĻāύā§āϝ āĻĨāĻžāĻā§ Thread Pool
- āϏāĻŦ āĻāĻŋāĻā§āϰ āϏāĻŽāύā§āĻŦā§ āĻāϰ⧠Event Loop â āϤāĻžāĻ āĻāĻā§ āĻŦāϞ⧠Event Driven Architecture
- Node.js āĻāĻāĻ Thread-āĻ āĻāϞ⧠â Single-threadedāĨ¤
- āĻāĻŋāύā§āϤ⧠Node.js libuv āĻāϰ āĻŽāĻžāϧā§āϝāĻŽā§ Thread Pool āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĨ¤
đ§ Internal Thread Pool:
Node.js asynchronous āĻāĻžāĻ (āϝā§āĻŽāύ file system, DNS lookup āĻāϤā§āϝāĻžāĻĻāĻŋ) āĻĒāϰāĻŋāĻāĻžāϞāύāĻžāϰ āĻāύā§āϝ background āĻ thread pool āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĨ¤
// File read with thread pool
const fs = require('fs');
fs.readFile('data.txt', (err, data) => {
console.log("File read done");
});
đ File read āĻšāϞ⧠libuv Thread Pool-āĻ āĻāϞ⧠āϝāĻžāϝāĻŧ, āĻāϰ callback āĻĒāϰ⧠Event Loop āĻ āĻĢāĻŋāϰ⧠āĻāϏā§āĨ¤
đ¨ Single Threaded Architecture āĻāϰ Downside
āϧāϰā§, āĻāĻŽāĻžāĻĻā§āϰ āĻāĻāĻāĻŋ Node.js āϏāĻžāϰā§āĻāĻžāϰ āĻāĻā§ â āϝā§āĻāĻŋ single-threadedāĨ¤
āĻāĻāύ āĻāĻā§ āĻāĻā§ ā§Ē āĻāύ āĻāĻāĻāĻžāϰ āύāĻŋāĻā§āϰ āϰāĻŋāĻā§ā§ā§āϏā§āĻāĻā§āϞ⧠āĻĒāĻžāĻ āĻžāĻā§āĻā§:
- đ§âđģ User 1: āĻĄā§āĻāĻž āϰāĻŋāĻā§ā§ā§āϏā§āĻ āĻāϰāĻā§ (āϏāĻšāĻ āĻāĻžāĻ)
- đ§âđģ User 2: āĻāĻāĻāĻŋ āĻŦā§ āĻĢāĻžāĻāϞ synchronously āĻĒā§āϤ⧠āĻāĻžāĻā§āĻā§ (āĻāĻžāϰāĻŋ āĻāĻžāĻ)
- đ§âđģ User 3: Database query āĻāϰāĻā§
- đ§âđģ User 4: āĻāϰāĻ āĻāĻāĻāĻŋ āĻĄā§āĻāĻž āϰāĻŋāĻā§ā§ā§āϏā§āĻ āĻāϰāĻā§
âī¸ āĻāĻāύ āĻā§ āĻāĻāĻŦā§?
-
User 1 āĻāϰ āϰāĻŋāĻā§ā§ā§āϏā§āĻ āĻā§āĻŦ āϏāĻšāĻ, āϏā§āĻā§āώā§āϤā§āϰ⧠Node.js āĻāĻā§ āϏāĻšāĻā§āĻ serve āĻāϰ⧠āĻĻāĻŋāĻŦā§āĨ¤
-
āϤāĻžāϰāĻĒāϰ User 2 āĻāĻāĻāĻŋ synchronous file read āĻāϰāϤ⧠āĻāĻžāĻā§āĻā§āĨ¤
â āĻāĻŋāύā§āϤ⧠āϏāĻŽāϏā§āϝāĻž āĻāĻāĻžāύā§! Synchronous āĻŽāĻžāύā§āĻ āĻāĻ āĻāĻžāĻ āĻļā§āώ āύāĻž āĻšāϞ⧠āĻĒāϰā§āϰ āĻāĻžāĻ āĻļā§āϰ⧠āĻšāĻŦā§ āύāĻžāĨ¤
āĻāĻāύ, āϝā§āĻšā§āϤ⧠file read āĻāĻāĻāĻž heavy task, āĻāĻŦāĻ āϏā§āĻāĻž synchronously āĻšāĻā§āĻā§, āϤāĻžāĻ:
- āĻĒā§āϰ⧠thread āĻ āĻāĻžāĻā§āĻ āĻāĻāĻā§ āĻĨāĻžāĻāĻŦā§āĨ¤
- User 3 āĻ User 4āĻāϰ āϰāĻŋāĻā§ā§ā§āϏā§āĻ āĻŦā§āϞāĻ āĻšā§ā§ āϝāĻžāĻŦā§āĨ¤
- āĻĢāĻžāĻāϞ āϝāϤ āĻŦā§, āĻ āĻĒā§āĻā§āώāĻžāϰ āϏāĻŽā§ āϤāϤ āĻŦā§āĻļāĻŋāĨ¤
āĻāĻāĻžāĻ āĻšāĻā§āĻā§ Single Threaded Architecture-āĻāϰ āĻŦā§ āĻāĻāĻāĻž disadvantageāĨ¤
đ ī¸ āϏāĻŽāĻžāϧāĻžāύ āĻā§?
āĻāĻ āϏāĻŽāϏā§āϝāĻžāϰ āϏāĻŽāĻžāϧāĻžāύ āĻĻā§ā§ Thread Pool + Asynchronous ProgrammingāĨ¤
āϝāĻĻāĻŋ User 2 āĻĢāĻžāĻāϞāĻāĻž asynchronously āĻĒā§āϤ⧠āϤāĻžāĻšāϞā§:
- Node.js āϏā§āĻ āĻāĻžāϰ⧠āĻāĻžāĻāĻāĻž Thread PoolāĻ āĻĒāĻžāĻ āĻŋā§ā§ āĻĻāĻŋāϤā§āĨ¤
- Thread Pool āĻŦā§āϝāĻžāĻāĻā§āϰāĻžāĻāύā§āĻĄā§ āĻāĻžāĻ āĻāϰāϤā§āĨ¤
- Event Loop meanwhile āĻ āύā§āϝ āĻāĻāĻāĻžāϰ (User 3 & 4) āĻāϰ āϰāĻŋāĻā§ā§ā§āϏā§āĻ āĻĒā§āϰāϏā§āϏ āĻāϰāϤā§āĨ¤
- āĻāĻžāĻ āĻļā§āώ āĻšāϞ⧠Thread Pool Event Loop āĻā§ āĻāĻžāύāĻžāϤā§āĨ¤
- āϤāĻžāϰāĻĒāϰ Event Loop User 2āĻā§ āϤāĻžāϰ āĻĢāĻžāĻāϞ āϰā§āϏāĻĒāύā§āϏ āĻĒāĻžāĻ āĻŋā§ā§ āĻĻāĻŋāϤā§āĨ¤
đ Event Driven Architecture āĻāϰ āϏā§āύā§āĻĻāϰā§āϝ
đ Node.js āĻāĻāĻāĻžāĻ āĻĨā§āϰā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĻ â
Asynchronous āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻžāϰ⧠Task āĻā§āϞā§āĻā§ smartly handle āĻāϰā§āĨ¤
- āĻā§āĻ Synchronous request āĻĒāĻžāĻ āĻžāϞ⧠āĻĒā§āϰ⧠āϏāĻžāϰā§āĻāĻžāϰ āĻāĻāĻā§ āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻŋāύā§āϤ⧠Asynchronous āĻšāϞā§, āĻāĻžāĻ āĻā§āϞ⧠back-end āĻ āĻāĻžāĻ āĻāϰ⧠āĻĻā§āĻā§āĻž āĻšā§āĨ¤
- āĻāϤ⧠āĻāϰ⧠āĻā§āĻ āĻŦā§āϞāĻ āĻšā§ āύāĻž, āĻāĻŦāĻ āϏāĻžāϰā§āĻāĻžāϰ āĻĒāĻžāϰāĻĢāϰāĻŽā§āϝāĻžāύā§āϏāĻ āĻāĻŽā§ āύāĻžāĨ¤
â āϏāĻžāϰāϏāĻāĻā§āώā§āĻĒā§:
- Synchronous āĻāĻžāϰ⧠āĻāĻžāĻāĻā§āϞ⧠Single Thread āĻŦā§āϞāĻ āĻāϰā§āĨ¤
- Asynchronous + Thread Pool āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϏā§āĻ āϏāĻŽāϏā§āϝāĻž āϏāĻŽāĻžāϧāĻžāύ āĻāϰāĻž āϝāĻžā§āĨ¤
- āĻāĻāĻžāĻ Node.js-āĻāϰ Event Driven, Non-blocking ArchitectureāĨ¤
â āĻāĻĒāϏāĻāĻšāĻžāϰ:
āĻŦāĻŋāώ⧠| āĻŦā§āϝāĻžāĻā§āϝāĻž |
---|---|
Node.js Architecture | Event-driven, Non-blocking |
Event Loop | Stack āĻāĻžāϞāĻŋ āĻĨāĻžāĻāϞ⧠Callback Queue āĻĨā§āĻā§ āĻĢāĻžāĻāĻļāύ āύā§ā§ |
Process | āĻĒā§āϰ⧠Node.js āĻ ā§āϝāĻžāĻĒā§āϰ runtime |
Thread | Process āĻāϰ āĻŽāϧā§āϝ⧠execution units; Node.js āĻŦā§āϝāĻžāĻāĻā§āϰāĻžāĻāύā§āĻĄā§ multiple thread āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠|