NodeJS จะ“ ไม่ปิดกั้น” ได้อย่างไร?


14

ฉันกำลังเรียนรู้ NodeJS และแค่ต้องการชี้แจงบางอย่าง ในแบบฝึกหัดเบื้องต้นและหนังสือหลายเล่มจนถึงตอนต้นพวกเขาได้อธิบายสถาปัตยกรรม "ไม่บล็อก" ของโหนดหรือค่อนข้างเป็นไปได้ (และแนะนำทั้งจุด) เป็นรหัสในลักษณะที่ไม่ปิดกั้น

ตัวอย่างเช่นตัวอย่างนี้มีให้ในหนังสือที่ฉันกำลังอ่านวิธีอะซิงโครนัสเพื่อรับข้อมูลจากฐานข้อมูล

http.createServer(function (req, res) {
  database.getInformation(function (data) {
      res.writeHead(200);
      res.end(data);
  });
});

เกิดอะไรขึ้น (ตามที่ฉันเข้าใจ) คือโหนดทำให้การเรียกไปยังฐานข้อมูลจากนั้นดำเนินการสิ่งที่อาจเกิดขึ้นต่อไปในสแต็คการโทร เมื่อการร้องขอฐานข้อมูลเสร็จสมบูรณ์ตัวแปรข้อมูลในฟังก์ชั่นการโทรกลับที่ไม่ระบุชื่อจะถูกเติมและฟังก์ชั่นนั้นจะถูกเพิ่มเข้าไปในสแต็คการโทร (และดำเนินการในภายหลังเมื่อโหนดเข้าสู่มัน)

คำถามของฉันคือการประมวลผลการร้องขอฐานข้อมูลคืออะไร? แน่นอนโหนดต้องปิดกั้นในขณะที่มันทำอย่างนั้น? การดูแลคำขอฐานข้อมูลคืออะไร หรือถ้าโหนดกำลังรอการร้องขอ HTTP GET แบบอะซิงโครนัสไปยังทรัพยากรภายนอกสิ่งที่ดูแลคำขอนั้นที่อนุญาตให้โหนดประมวลผลสแต็กการโทรต่อและเป็น "non-blocking"

คำตอบ:


17

เมื่อ Node.js ถูกอธิบายว่าเป็น "non-blocking" นั่นหมายถึงว่า IO นั้นไม่ใช่การปิดกั้น โหนดใช้libuvเพื่อจัดการ IO ในลักษณะที่ไม่เชื่อเรื่องพระเจ้า บน Windows ใช้พอร์ต IO ที่สมบูรณ์บน Unix ใช้ epoll / kqueue / select / etc ดังนั้นมันทำให้คำขอ IO ที่ไม่ปิดกั้น (ซึ่งอาจมีการตรวจสอบด้ายพื้นหลัง แต่นี่ไม่เคยสัมผัสกับ JavaScript) และตามผลมันจะรอมันภายในวงเหตุการณ์ที่เรียก JavaScript โทรกลับบนหลัก (อ่าน: เท่านั้น) ด้ายจาวา

สำหรับฐานข้อมูลขึ้นอยู่กับวิธีเขียนไลบรารี หากใช้ HTTP ในการสื่อสาร (เช่นเดียวกับฐานข้อมูล NoSQL บางส่วน) ก็สามารถเขียนได้อย่างง่ายดายใน JavaScript บริสุทธิ์โดยใช้httpไลบรารีโหนดมาตรฐาน ถ้ามันเป็นอย่างอื่นเอาละนั่นก็ขึ้นอยู่กับห้องสมุดแล้ว มันสามารถเขียนใน C / C ++ และใช้เธรดพื้นหลังตราบเท่าที่สิ่งที่เป็นนามธรรมไม่เคยสัมผัสกับ JavaScript

สำหรับคำถามของคุณเกี่ยวกับสิ่งที่ "ประมวลผล" การร้องขอฐานข้อมูลสิ่งที่ควรทำคือการส่งข้อความง่ายๆไปยังห้องสมุด (เช่นคำสั่ง SQL หรือแบบสอบถามอื่น ๆ หรือคำขอเชื่อมต่อ) และ ณ จุดนั้น JavaScript ของคุณ ต่อเนื่องในการสับ เมื่อไลบรารีพร้อมที่จะส่งข้อความกลับมันจะส่งข้อความกลับไปยังคิวเหตุการณ์ของโหนดซึ่งเรียกใช้การเรียกกลับทำให้สามารถเรียกใช้โค้ดขนาดสั้นได้


มีnetแพ็คเกจเมื่อ http ไม่พร้อมใช้งาน
Florian Margaine

รายละเอียดที่อาจช่วยได้ โหนดใช้ประโยชน์จากเครื่องยนต์ V8 JS หนึ่งในคุณสมบัติที่ดีที่สุดของ V8 คือความง่ายในการเชื่อมกระบวนการ C / C ++ เข้ากับการเรียก JS ฟังก์ชั่นจาวาสคริปต์กำลังปิดกั้น แต่ฟังก์ชั่นทั้งหมดจะเรียกบางสิ่งภายใต้ประทุนที่ไม่ได้ปิดกั้น จากนั้นฟังก์ชัน JS อื่นจะตอบสนองเมื่อกระบวนการนั้นเสร็จสิ้น ฟังก์ชั่น JS ปิดกั้นหมายความว่าคุณจะไม่เคยมีสองสิ่งที่พยายามทำเช่นกำหนดเวลาการเขียนไปยังตำแหน่งไฟล์เดียวกันในเวลาเดียวกันซึ่งเป็นที่ที่ฉันคิดว่าต้องจัดการแบบมัลติเธรด ชัดเจนเสมอว่าคำขอใดมาก่อนเพื่อจุดประสงค์ในการเข้าคิว
Erik Reppen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.