Python และ Ruby ยังมีกรอบเช่นนี้ แต่เนื่องจากไลบรารีที่มีรหัสซิงโครนัสใช้อย่างหลีกเลี่ยงไม่ได้ในการใช้งานจริงพวกเขาจึงไม่เติบโต ก่อนที่ Node.js การเขียนโปรแกรมฝั่งเซิร์ฟเวอร์ของ JavaScript เกือบจะว่างเปล่าดังนั้น Node.js จึงสามารถสร้างไลบรารีรหัสที่ IO ทั้งหมดเป็นแบบอะซิงโครนัส
คอขวดของเว็บแอปพลิเคชันส่วนใหญ่อยู่ใน IO คืออ่านและเขียนดิสก์อ่านและเขียนเครือข่ายและอ่านและเขียนฐานข้อมูล กลยุทธ์ประเภทใดที่จะใช้เพื่อรอช่วงเวลานี้ได้กลายเป็นจุดสำคัญในการปรับปรุงประสิทธิภาพ
กลยุทธ์ของ PHP: เรียกใช้หลายกระบวนการรอให้ IO เสร็จสมบูรณ์โดยตรง ข้อเสีย: หลายกระบวนการใช้หน่วยความจำหลายหน่วยความจำทำให้ยากที่จะแบ่งปันข้อมูลระหว่างกระบวนการ
กลยุทธ์ทั่วไป C/C ++: เรียกใช้มัลติเธรดและโปรแกรมจะรักษาสถานะล็อคไว้ ข้อเสีย: ค่าใช้จ่ายในการพัฒนาที่สูงง่ายต่อการทำผิดพลาดและยากที่จะแก้ไขข้อบกพร่อง
Python (พายุทอร์นาโด): มีการดำเนินการตามคำขอหลายครั้งในกระบวนการเดียวและเปลี่ยนไปใช้คำขออื่นเมื่อฉันพบ IO ข้อเสีย: สำหรับคำขอเดียวเวลายังไม่ได้ใช้อย่างมีประสิทธิภาพมากที่สุด
"ใช้เวลามากที่สุด" คืออะไร? ตัวอย่างเช่นขณะนี้มีสองข้อความค้นหาฐานข้อมูลที่ไม่เกี่ยวข้อง ใน PHP หนึ่งมักจะถูกดำเนินการก่อนและอันที่สองจะถูกดำเนินการหลังจากการดำเนินการเสร็จสมบูรณ์ (เวลารวมคือ A + B) เห็นได้ชัดว่านี่ไม่ใช่ประสิทธิภาพมากที่สุด ควรดำเนินการแบบสอบถามสองแบบในเวลาเดียวกันและเวลาคือสูงสุด (a, b)
ปัญหาเกี่ยวกับ Python และภาษาอื่น ๆ ที่รองรับ multithreading คือในระดับภาษามันเป็นเรื่องยากสำหรับโปรแกรมเมอร์ที่จะบอกเครื่องเสมือนจริงว่าการดำเนินการสองครั้งควรดำเนินการพร้อมกัน แม้ว่าจะมีวิธี แต่ก็ค่อนข้างลำบาก คนส่วนใหญ่ขี้เกียจเกินไปที่จะใช้ (ไม่คุ้มค่าที่จะใช้) เนื่องจาก node.js บังคับให้การดำเนินการทั้งหมดของ IO ทั้งหมดแบบอะซิงโครนัสโปรแกรมโปรแกรมเมอร์ Node.js สามารถกล่าวได้ว่าคุ้นเคยกับมัน เมื่อรวมกับไลบรารีบางแห่งเพื่อปรับปรุงความสามารถในการอ่านรหัส (สัญญา, Async) สามารถอนุญาตให้ดำเนินการที่ไม่เกี่ยวข้องได้อย่างง่ายดายในแบบคู่ขนาน
การพูดคุยข้างต้นเกี่ยวกับการใช้ IO แบบอะซิงโครนัสดังนั้นข้อดีของ IO แบบอะซิงโครนัสจะสะท้อนอยู่ที่ไหน? ในความเป็นจริง IO แบบอะซิงโครนัสไม่สามารถลดแรงกดดันบนเซิร์ฟเวอร์ได้อย่างน่าอัศจรรย์ ในการเพิ่มเซิร์ฟเวอร์คุณยังต้องเพิ่มเซิร์ฟเวอร์ แต่ IO แบบอะซิงโครนัสจะลดเวลาของคำขอเดียวและลบเวลารอคอยที่ไม่มีความหมายในคำขอเดียว ดังนั้นคำขอที่ประมวลผลภายในเวลาหน่วยไม่เปลี่ยนแปลง แต่เวลาในการประมวลผลสำหรับแต่ละคำขอลดลง จากมุมมองนี้เซิร์ฟเวอร์ยังบันทึกทรัพยากรบางอย่าง - นั่นคือรักษาหน่วยความจำที่ใช้โดยการเชื่อมต่อที่ร้องขอแต่ละครั้ง