มาดูกันว่าการปิดกั้นคืออะไร
ฉันจำลองวิธีการนอนหลับ () เพื่อชะลอการพิมพ์ Hello Star เป็นเวลา 10 วินาที
requesthandlers.js
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่นเริ่มต้น () {
console.log ("คำขอเริ่มต้น 'start' ถูกเรียก");
ฟังก์ชั่นการนอนหลับ (มิลลิวินาที) {
var startTime = new Date (). getTime ();
ในขณะที่ (วันที่ใหม่ (). getTime () <startTime + Millionseconds);
-
นอนหลับ (10,000);
กลับ "สวัสดีเริ่ม";
-
ฟังก์ชั่นอัปโหลด () {
console.log ("คำขอตัวจัดการ 'อัพโหลด' ถูกเรียกว่า");
กลับ "สวัสดีอัปโหลด";
-
ExportS.Start = Start;
ExportS.UPLOAD = อัปโหลด;
เมื่อร้องขอ /เริ่มต้นจะล่าช้า 10 วินาทีก่อนพิมพ์
เมื่อร้องขอ/อัปโหลดจะไม่ได้รับผลกระทบ
ถัดไปทำการทดลอง:
ป้อน http: // localhost: 8888/เริ่มในแถบที่อยู่ของหน้าต่างเบราว์เซอร์แรก แต่อย่าเปิดก่อน!
ป้อน http: // localhost: 8888/อัปโหลดในแถบที่อยู่ของหน้าต่างเบราว์เซอร์ที่สอง ในทำนองเดียวกันอย่าเปิดมันก่อน!
เรากด Enter ในหน้าต่างแรก ("/start") และสลับไปที่หน้าต่างที่สองอย่างรวดเร็ว ("/อัปโหลด") แล้วกด Enter
หมายเหตุสิ่งที่เกิดขึ้น:
URL /Start ใช้เวลาโหลด 10 วินาทีซึ่งเหมือนกับที่เราคาดไว้
URL /UPLOAD ใช้เวลาจริง 10 วินาที!
แต่มันไม่มีการดำเนินการคล้ายกับ Sleep () ในตัวจัดการคำขอที่สอดคล้องกัน ปัญหาคืออะไร?
เหตุผลก็คือเริ่มต้น () รวมถึงการปิดกั้นการดำเนินการ เพื่อให้ได้อย่างชัดเจน "มันบล็อกงานการประมวลผลอื่น ๆ ทั้งหมด"
node.js เป็นเธรดเดี่ยวและสามารถประมวลผลงานแบบขนานโดยไม่ต้องเพิ่มเธรดเพิ่มเติม
มันใช้การดำเนินการแบบขนานผ่านลูปเหตุการณ์และเราควรใช้ประโยชน์อย่างเต็มที่ - หลีกเลี่ยงการปิดกั้นการดำเนินการให้มากที่สุดเท่าที่จะเป็นไปได้แทนที่จะใช้การดำเนินการที่ไม่ปิดกั้นบ่อยขึ้น
ในส่วนถัดไปเราจะแนะนำวิธีการดำเนินการที่ไม่ปิดกั้น