นี่อาจดูเหมือนคำถามพื้นฐาน แต่ฉันไม่พบเอกสาร:
อะไรคือความแตกต่างระหว่างการฟอร์กและการวางไข่กระบวนการ node.js? ฉันได้อ่านแล้วว่าการฟอร์กเป็นกรณีพิเศษของการวางไข่ แต่อะไรคือกรณีการใช้งานที่แตกต่างกัน / การใช้งานซ้ำสำหรับการใช้งานแต่ละแบบ
นี่อาจดูเหมือนคำถามพื้นฐาน แต่ฉันไม่พบเอกสาร:
อะไรคือความแตกต่างระหว่างการฟอร์กและการวางไข่กระบวนการ node.js? ฉันได้อ่านแล้วว่าการฟอร์กเป็นกรณีพิเศษของการวางไข่ แต่อะไรคือกรณีการใช้งานที่แตกต่างกัน / การใช้งานซ้ำสำหรับการใช้งานแต่ละแบบ
คำตอบ:
วางไข่เป็นคำสั่งที่ออกแบบมาเพื่อรันคำสั่งระบบ เมื่อคุณรันการวางไข่คุณจะส่งคำสั่งระบบที่จะทำงานในกระบวนการของตัวเอง แต่จะไม่รันโค้ดเพิ่มเติมใด ๆ ภายในกระบวนการโหนดของคุณ คุณสามารถเพิ่ม listeners สำหรับกระบวนการที่คุณวางไข่เพื่ออนุญาตให้โค้ดของคุณโต้ตอบกับกระบวนการที่เกิดใหม่ แต่ไม่มีการสร้างอินสแตนซ์ V8 ใหม่ (เว้นแต่แน่นอนว่าคำสั่งของคุณคือคำสั่ง Node อื่น แต่ในกรณีนี้คุณควรใช้ fork!) และ โมเดอร์โหนดของคุณหนึ่งสำเนาเท่านั้นที่แอ็คทีฟบนตัวประมวลผล
Fork เป็นตัวอย่างพิเศษของการวางไข่ซึ่งทำงานเป็นตัวอย่างใหม่ของเครื่องยนต์ V8 หมายความว่าคุณสามารถสร้างคนงานหลายคนทำงานบนฐานรหัสโหนดเดียวกันหรืออาจเป็นโมดูลที่แตกต่างกันสำหรับงานเฉพาะ สิ่งนี้มีประโยชน์มากที่สุดสำหรับการสร้างกลุ่มผู้ปฏิบัติงาน แม้ว่ารูปแบบเหตุการณ์ async ของโหนดจะอนุญาตให้ใช้แกนเดียวของเครื่องได้อย่างมีประสิทธิภาพพอสมควร แต่ก็ไม่อนุญาตให้กระบวนการโหนดใช้ประโยชน์จากเครื่องมัลติคอร์ วิธีที่ง่ายที่สุดในการบรรลุเป้าหมายนี้คือการเรียกใช้โปรแกรมเดียวกันหลายชุดในโปรเซสเซอร์เดียว
กฎง่ายๆคือกระบวนการหนึ่งถึงสองโหนดต่อหนึ่งคอร์อาจจะมากกว่าสำหรับเครื่องที่มีอัตราส่วนสัญญาณนาฬิกา ram / cpu ดีกว่าหรือสำหรับกระบวนการของโหนดที่หนักหน่วงใน I / O และแสงในการทำงานของ CPU เพื่อลดเวลาหยุดทำงานของเหตุการณ์ วนกำลังรอเหตุการณ์ใหม่ อย่างไรก็ตามข้อเสนอแนะหลังคือการเพิ่มประสิทธิภาพขนาดเล็กและจะต้องมีการเปรียบเทียบอย่างระมัดระวังเพื่อให้แน่ใจว่าสถานการณ์ของคุณเหมาะสมกับความต้องการสำหรับกระบวนการ / แกนหลักจำนวนมาก คุณสามารถลดประสิทธิภาพลงได้ด้วยการสร้างคนงานมากเกินไปสำหรับเครื่องจักร / สถานการณ์จำลองของคุณ
ในที่สุดคุณสามารถใช้วางไข่ในลักษณะที่ได้ทำข้างต้นโดยการส่งคำสั่งโหนด แต่นี่อาจเป็นเรื่องงี่เง่าเพราะ fork ทำบางสิ่งเพื่อเพิ่มประสิทธิภาพกระบวนการสร้างอินสแตนซ์ V8 เพียงแค่ทำให้ชัดเจนว่าในที่สุดไข่วางบนโลกไซเบอร์ส้อม ทางแยกเป็นเพียงที่ดีที่สุดสำหรับกรณีนี้และมีประโยชน์มากกรณีใช้
http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
TLDR
Spawn
เมื่อวางไข่จะถูกสร้างขึ้น- มันสร้างอินเตอร์เฟซการสตรีมระหว่างกระบวนการหลักและลูก
การสตรีมอินเทอร์เฟซหมายถึง - การบัฟเฟอร์ข้อมูลในรูปแบบไบนารีในONE TIME
Fork
เมื่อส้อมจะถูกสร้างขึ้น-มันจะสร้างช่องทางการสื่อสารระหว่างผู้ปกครองและกระบวนการเด็ก
ช่องทางการสื่อสารหมายถึง - การส่งข้อความ
Difference
ทั้งคู่ดูเหมือนว่าจะทำการถ่ายโอนข้อมูลเดียวกันยกเว้นด้านล่างแตกต่างกัน
วางไข่จะมีประโยชน์เมื่อคุณต้องการบัฟเฟอร์ข้อมูลต่อเนื่องในรูปแบบไบนารี่ / การเข้ารหัสเช่น - ถ่ายโอนไฟล์วิดีโอ 1GB, รูปภาพ, ไฟล์บันทึกในONE TIME
forkจะมีประโยชน์เมื่อคุณต้องการส่งข้อความ
เช่น - JSON
หรือXML
การรับส่งข้อมูล
Conslusion
วางไข่ควรใช้สำหรับการสตรีมข้อมูลขนาดใหญ่ / ไฟล์ / ภาพจากกระบวนการวางไข่ไปยังกระบวนการ ปกครอง
ทางแยกควรใช้สำหรับการส่งข้อความ Json / Xml
FORK
อย่างอื่นถ้าคุณมีกลุ่มข้อมูลขนาดใหญ่มากที่จะถูกเก็บไว้ใช้SPAWN
วิธีการ child_process.spawn เปิดตัวกระบวนการใหม่ด้วยคำสั่งที่กำหนด มันมีลายเซ็นดังต่อไปนี้ -
child_process.spawn(command[, args][, options])
อ่านเพิ่มเติมเกี่ยวกับตัวเลือก
วิธีการวางไข่ () ส่งคืนสตรีม (stdout & stderr) และควรใช้เมื่อกระบวนการส่งคืนปริมาณข้อมูลจำนวนมาก วางไข่ () เริ่มได้รับการตอบสนองทันทีที่กระบวนการเริ่มดำเนินการ
เมธอดchild_process.forkเป็นกรณีพิเศษของการวางไข่ ()เพื่อสร้างกระบวนการโหนด มันมีลายเซ็นดังต่อไปนี้ -
child_process.fork(modulePath[, args][, options])
เมธอด fork ส่งคืนอ็อบเจ็กต์ที่มีช่องทางการสื่อสารในตัวนอกเหนือจากการมีเมธอดทั้งหมดในอินสแตนซ์ ChildProcess ปกติ
var child = require('child_process').fork('child.js');
ตัวอย่างเช่นในแอพหลักของฉันตอนนี้ฉันจะมี 2 คอร์แยกกันทำงาน ถ้าฉันต้องทำงานหนักสำหรับลูปใน child.js (โปรเซส) ฉันจะใช้ประโยชน์จากคอร์มากขึ้นเพื่อใช้พาวเวอร์ child.js ใช่ไหม? การใช้งาน cpu นั้นจะส่งผลกระทบต่อแกนแอปหลักของฉันหรือไม่