nodejs ไม่ใช่แบบมัลติเธรด แต่เป็นแบบเธรดเดียว nodejs ใช้โหมดไม่บล็อกแบบอะซิงโครนัสแบบเธรดเดียว เนื่องจากเอ็นจิ้น JavaScript โหนดจึงเป็นแบบเธรดเดียวโดยค่าเริ่มต้น วิธีการ "I/O" ที่ขับเคลื่อนด้วยเหตุการณ์และอะซิงโครนัสเพื่อให้ได้สภาพแวดล้อมรันไทม์แบบเธรดเดียวและพร้อมกันสูง
สภาพแวดล้อมการทำงานของบทความนี้: ระบบ Windows 10, nodejs เวอร์ชัน 12.19.0, คอมพิวเตอร์ Dell G3
โหนดเป็นแบบเธรดเดียวและใช้โหมดไม่บล็อกแบบอะซิงโครนัสเธรดเดียว
เนื่องจากเอ็นจิ้น JavaScript โหนดจึงเป็นเธรดเดียวตามค่าเริ่มต้น และแอปพลิเคชัน node.js ไม่สามารถใช้ทรัพยากรแบบมัลติคอร์ได้
Node.js ใช้ I/O ที่ขับเคลื่อนด้วยเหตุการณ์และแบบอะซิงโครนัสเพื่อใช้สภาพแวดล้อมรันไทม์แบบเธรดเดียวและพร้อมกันสูง หมายความว่ามีเพียงสิ่งเดียวเท่านั้นที่สามารถทำได้ในเวลาเดียวกัน
Nodejs ใช้แบบอะซิงโครนัสและไม่มีการบล็อก:
ใน nodejs จริงๆ แล้วมีเพียงการดำเนินการ js เท่านั้นที่เป็นเธรดเดียว และ I/O ก็เป็นเธรดอื่นอย่างเห็นได้ชัด
เธรดการดำเนินการ js เป็นแบบเธรดเดียว ตราบใดที่ I/O ที่ต้องการถูกส่งผ่านไปยัง libuv เธรดนั้นจะกลับมาทำสิ่งอื่นทันที จากนั้น libuv จะโทรกลับตามเวลาที่กำหนด
ในรายละเอียด อันดับแรก nodejs จะเรียกมันจากโค้ด js ในการผูกโหนดกับโค้ด C/C จากนั้นสรุปสิ่งที่เรียกว่า "ออบเจ็กต์คำขอ" ในโค้ด C/C แล้วส่งต่อไปยัง libuv ออบเจ็กต์คำขอนี้บางส่วนคล้ายกับฟังก์ชันคอลแบ็กที่จำเป็นต้องดำเนินการ เพียงดำเนินการเรียกกลับไปยัง libuv และใช้การเรียกกลับหลังจากดำเนินการ
กล่าวโดยสรุป กระบวนการทั่วไปของ I/O แบบอะซิงโครนัสมีดังนี้
1. เริ่มการโทร I/O
ผู้ใช้เรียกโมดูลหลักของโหนดจากโค้ด Javascript และส่งผ่านพารามิเตอร์และฟังก์ชันการเรียกกลับไปยังโมดูลหลัก
โมดูลหลักของโหนดสรุปพารามิเตอร์ที่ส่งผ่านและฟังก์ชันการเรียกกลับในวัตถุคำขอ
พุชอ็อบเจ็กต์คำขอนี้ไปที่พูลเธรด I/O เพื่อรอการรัน
การเรียกแบบอะซิงโครนัส Javascript สิ้นสุดลง และเธรด Javascript ยังคงดำเนินการต่อไป
2. ดำเนินการโทรกลับ
หลังจากการดำเนินการ I/O เสร็จสิ้น ฟังก์ชันการเรียกกลับที่ห่อหุ้มไว้ก่อนหน้านี้ในออบเจ็กต์คำขอจะถูกดึงและดำเนินการเพื่อให้บรรลุวัตถุประสงค์ของการเรียกกลับ Javascript (รายละเอียดการติดต่อกลับมีอธิบายไว้ด้านล่าง)
จะเห็นได้จากที่นี่ว่าเราเข้าใจผิดเกี่ยวกับเธรดเดี่ยวของ Node.js มาโดยตลอด
ในความเป็นจริง single thread หมายถึงเธรดเดียวในสภาพแวดล้อมรันไทม์ Javascript และ Node.js ไม่มีความสามารถในการสร้างเธรดใหม่เมื่อรัน Javascript การดำเนินการจริงขั้นสุดท้ายยังคงดำเนินการใน Libuv และลูปเหตุการณ์ นี่คือสาเหตุที่ Javascript ซึ่งเป็นภาษาเธรดเดียวสามารถใช้การดำเนินการแบบอะซิงโครนัสใน Node.js ได้ ทั้งสองจะไม่ขัดแย้งกัน
ขยายความรู้ของคุณ:
ภาพรวมมัลติเธรดของ Node.js
บางคนอาจบอกว่าแม้ว่า Node.js จะเป็นแบบเธรดเดียว แต่ก็สามารถใช้เหตุการณ์แบบวนรอบ (Event Loop) เพื่อดำเนินงานการดำเนินการพร้อมกันได้ จากการตรวจสอบสาระสำคัญของมัน NodeJs ใช้เธรดที่แตกต่างกันสองเธรด อันแรกเป็นเธรดหลักสำหรับการประมวลผลเหตุการณ์ลูป และอีกเธรดเป็นเธรดเสริมในพูลผู้ปฏิบัติงาน หน้าที่หลักและความสัมพันธ์ของทั้งสองเธรดมีดังนี้:
การเรียนรู้ที่แนะนำ: "วิดีโอสอน nodejs"
ข้างต้นคือรายละเอียดว่า nodejs เป็นแบบมัลติเธรดหรือไม่ สำหรับข้อมูลเพิ่มเติม โปรดอ่านบทความอื่นๆ ที่เกี่ยวข้องบนเว็บไซต์นี้