สถาปัตยกรรมที่ขับเคลื่อนโดยเหตุการณ์ของ Node.js แตกต่างกันอย่างไรกับการเขียนโปรแกรมแบบหลายเธรดในภาษาอื่น ๆ


ตอบ 1:

ทั้งในเหตุการณ์ที่ขับเคลื่อนด้วยและกระบวนทัศน์แบบมัลติเธรดรหัสทำงานภายในกระบวนการของระบบปฏิบัติการ

เมื่อกระบวนการรันหลายเธรดเธรดเหล่านี้จะแชร์หน่วยความจำกระบวนการ (พื้นที่แอดเดรส) ทั้งสำหรับการอ่านและการเขียน

จาวาสคริปต์ที่ให้อำนาจ Node.js นั้นเป็นเธรดเดี่ยวโดยการออกแบบ ทุกฟังก์ชั่นรับประกันว่าจะทำงานจนเสร็จและไม่มีรหัส JavaScript อื่น ๆ ในกระบวนการปัจจุบันที่จะทำงานในระหว่างการเรียกใช้ฟังก์ชันนั้น เหตุการณ์แบบอะซิงโครนัสตามธรรมชาติ (เครือข่ายอินพุตดิสก์เอาต์พุตตัวจับเวลาฮาร์ดแวร์อื่น ๆ และเหตุการณ์ของระบบปฏิบัติการ) ได้รับการจัดการโดยเอ็นจินซึ่งเพิ่มฟังก์ชัน JavaScript ที่ลงทะเบียนเป็นตัวจัดการ (หรือโทรกลับ) สำหรับเหตุการณ์เหล่านี้ ฟังก์ชั่นด้านหน้าคิวเสร็จสิ้นแล้ว

ในกระบวนทัศน์แบบมัลติเธรดเธรดอย่างน้อยสองเธรดจะรันโค้ดในแบบขนานดังนั้นระหว่างฟังก์ชันที่รันโค้ดที่แตกต่างกันอาจทำงานได้ดีบนแกนประมวลผลที่แตกต่างกันอาจอ่านหรือเขียนไปยังที่อยู่หน่วยความจำเดียวกัน สิ่งนี้อาจส่งผลให้สถานะของหน่วยความจำไม่สอดคล้องกันยกเว้นว่ามีการใช้กลไกระบบปฏิบัติการพิเศษ (การซิงโครไนซ์แบบดั้งเดิม) ในการจัดการการเข้าถึงหน่วยความจำที่ใช้ร่วมกัน



ตอบ 2:

นี่เป็นคำถามที่ดี“ ความแตกต่างระหว่างสถาปัตยกรรมที่ขับเคลื่อนด้วยเหตุการณ์ของ Node.js กับการเขียนโปรแกรมแบบหลายเธรดในภาษาอื่นคืออะไร”

เราสามารถและควรทำลายมันลงเล็กน้อย

  • สถาปัตยกรรมที่ขับเคลื่อนโดยเหตุการณ์ของโหนด

สถาปัตยกรรมที่ขับเคลื่อนด้วยเหตุการณ์ไม่ได้ จำกัด เฉพาะโหนด, เช่น, Tornado (Python), Vertx (Java), Akka (Scala), ReactiveX (หลายภาษา)

  • การเขียนโปรแกรมแบบมัลติเธรดในภาษาอื่น

โปรดทราบว่า JavaScript โดยการออกแบบไม่รองรับหลายเธรด แม้ว่ามันจะรองรับ webworkers ซึ่งเท่าที่ฉันรู้สามารถทำหน้าที่เป็นเธรดได้

ดังนั้นการขับเคลื่อนเหตุการณ์จึงไม่ซ้ำกับ Node และสามารถทำเธรดหลายเธรดใน Node ได้

ดังนั้นอาจมีสองคำถามที่นี่: "อะไรคือความแตกต่างระหว่างการขับเคลื่อนเหตุการณ์และการมัลติเธรด" และ "ความแตกต่างระหว่างโหนดและภาษาอื่น ๆ (กรอบ) คืออะไร ฉันจะมุ่งเน้นไปที่สิ่งที่ดูเหมือนจะเป็นจุดประสงค์ของคำถาม

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

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



ตอบ 3:

ความแตกต่างทางแนวคิดค่อนข้างง่ายที่จะห่อหัวของคุณ

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

สถาปัตยกรรมแบบมัลติเธรดโดยทั่วไปยื้อเธรดใหม่เมื่อต้องรอการดำเนินการ ดังนั้นคุณทำการเรียกไปยังฐานข้อมูลและคุณหมุนเธรดใหม่ที่จะดำเนินการทุกสิ่งที่คุณต้องการและทำสิ่งที่คุณต้องการและสรุปหรือเข้าร่วมเธรดเดิมอีกครั้ง

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