ฉันได้เรียนรู้และใช้ node.js เป็นเวลาสองเดือน ฉันได้ใช้ Express และรวมกับ Mongoose เพื่อเขียนเว็บแอปพลิเคชันและชุด APIs ของเว็บ มองย้อนกลับไปที่การแนะนำของ node.js ในหน้าแรกของเว็บไซต์ทางการของ node.js: node.js ใช้โมเดล I/O ที่ขับเคลื่อนด้วยเหตุการณ์ซึ่งทำให้น้ำหนักเบาและมีประสิทธิภาพ ดังนั้นรุ่น I/O ที่ไม่ปิดกั้นหมายถึงอะไร?
โมเดล IO ที่ไม่ปิดกั้น
ก่อนอื่นการดำเนินการ IO นั้นใช้เวลานานอย่างไม่ต้องสงสัย เมื่อเซิร์ฟเวอร์ได้รับคำขอจำนวนมากการสร้างกระบวนการหรือเธรดสำหรับแต่ละคำขอจะเพิ่มค่าใช้จ่ายหน่วยความจำเพิ่มเติมและอาจเสียเวลาและทรัพยากรมากขึ้น
เนื่องจาก node.js เป็นเหตุการณ์ที่ขับเคลื่อนด้วยเหตุการณ์จึงใช้ลูปเหตุการณ์เพื่อแก้ปัญหาคอขวดที่เกิดจากการดำเนินงานของ IO ใน node.js การดำเนินการ IO มักจะมีฟังก์ชั่นการโทรกลับ เมื่อการดำเนินการ IO เสร็จสิ้นและส่งคืนฟังก์ชันการโทรกลับจะถูกเรียกและเธรดหลักยังคงดำเนินการรหัสต่อไปนี้ มาอธิบายปัญหานี้ด้วยตัวอย่าง:
คำขอ ('http://www.google.com', ฟังก์ชั่น (ข้อผิดพลาด, การตอบสนอง, ร่างกาย) {console.log (ร่างกาย);}); console.log ('เสร็จแล้ว!');รหัสนี้หมายถึงการออกคำขอไปยัง 'http://www.google.com' และเมื่อคำขอส่งคืนฟังก์ชั่นการโทรกลับนี้ข้อมูลการตอบกลับจะถูกส่งออก เนื่องจากกลไกการทำงานของ node.js หลังจากรหัสนี้ทำงานแล้วมันจะส่งออกทันที 'เสร็จสิ้น!' บนคอนโซลแล้วส่งออกข้อมูลการตอบกลับหลังจากระยะเวลาหนึ่ง
Event Loop Event Loop
ต่อไปให้หารือเกี่ยวกับกลไกของ Event Loop ก่อนอื่นมาพูดถึงการโทรเช่นมีรหัสต่อไปนี้:
ฟังก์ชั่น a (arg, func) {var a = arg; func (); console.log ('a'); } function b () {console.log ('b');} a (0, b);หลังจากดำเนินการรหัสฟังก์ชัน A จะถูกผลักเข้าไปในการโทรครั้งแรกและกลายเป็นองค์ประกอบด้านบนของสแต็กและเริ่มดำเนินการ A. ในระหว่างกระบวนการดำเนินการฟังก์ชัน B จะถูกผลักเข้าไปในสายและกลายเป็นองค์ประกอบด้านบนของสแต็ก หลังจากดำเนินการ B แล้ว B จะปรากฏขึ้นและเรียกว่าและ A กลายเป็นองค์ประกอบด้านบนของสแต็กอีกครั้ง หลังจากถูกดำเนินการแล้ว A จะโผล่ขึ้นมาและเรียกว่าและการโทรนั้นไม่ได้ใช้งาน
มีคิวข้อความในรันไทม์ JavaScript และข้อความเชื่อมโยงกับฟังก์ชั่นการเรียกกลับ เมื่อเหตุการณ์ถูกเรียกใช้หากเหตุการณ์มีฟังก์ชั่นการโทรกลับที่สอดคล้องกันข้อความจะถูกเพิ่มลงในคิวข้อความ
มาพูดคุยกันว่า Event Loop คืออะไร หลังจากรหัสเริ่มดำเนินการฟังก์ชั่นจะถูกผลักเข้าไปในการโทรอย่างต่อเนื่อง นำตัวอย่างด้านบน คำขอจะถูกส่งไปยังการโทรและฟังก์ชั่นนี้จะทำให้คำขอ HTTP (คำขอ HTTP นี้จะถูกส่งไปยังโมดูลพื้นฐานของ node.js) และเหตุการณ์ที่เสร็จสมบูรณ์ในเวลาเดียวกันเชื่อมโยงกับฟังก์ชั่นการเรียกกลับ คำขอจะปรากฏขึ้นและเรียกและ console.log ถูกผลักเข้าไปในการโทรเพื่อเริ่มดำเนินการ เมื่อคำขอเสร็จสมบูรณ์เหตุการณ์ที่เสร็จสมบูรณ์จะถูกทริกเกอร์และเพิ่มข้อความลงในคิวข้อความ คิวข้อความก่อนตรวจสอบว่าการโทรไม่ได้ใช้งานหรือไม่ หากการโทรไม่ได้ใช้งานมันจะรอจนกว่าการโทรจะไม่ได้ใช้งานและปรากฏขึ้นที่หัวของคิวข้อความ ในเวลานี้ฟังก์ชั่นการโทรกลับที่เกี่ยวข้องกับข้อความจะถูกดำเนินการ
สรุป
ข้างต้นเป็นบทสรุปแนวคิดของรูปแบบที่ไม่ปิดกั้นและลูปเหตุการณ์ กลไกของลูปเหตุการณ์นี้ไม่เพียง แต่ไม่ซ้ำกันกับ node.js และรหัสของ node.js ถูกดำเนินการโดยเธรดเดียว อะไรคือข้อดีเมื่อต้องเผชิญกับคำขอที่เกิดขึ้นพร้อมกันจำนวนมาก?
ภาพด้านบนแสดงไดอะแกรมสถาปัตยกรรมของ Node.js มีโมดูลในชั้นพื้นฐานของ node.js รับผิดชอบในการบำรุงรักษาพูลเธรด เมื่อมีการออกคำขอ IO เลเยอร์พื้นฐานของ node.js จะสร้างเธรดใหม่เพื่อประมวลผลคำขอจากนั้นส่งคืนผลลัพธ์ไปยังชั้นบนหลังจากเสร็จสิ้น จากนั้นเมื่อมีการร้องขอหลายครั้งโมดูลพื้นฐานของ node.js จะใช้เธรดน้อยที่สุดเท่าที่จะเป็นไปได้เพื่อทำงานให้เสร็จสมบูรณ์มากที่สุด หากมีเธรดฟรีมันจะยังคงใช้ในการทำสิ่งอื่น ๆ สิ่งนี้ฉลาดกว่าและมีประสิทธิภาพมากขึ้นสำหรับการเปิดกระบวนการหรือเธรดใหม่สำหรับแต่ละคำขอตามที่กล่าวไว้ก่อนหน้านี้
บทความนี้เป็นบทสรุปของโหนดการเรียนรู้ หากมีปัญหาหรือข้อบกพร่องใด ๆ การวิจารณ์และการแก้ไขยินดีต้อนรับ