ขณะเขียนโปรแกรมใน “ node.js ” กระบวนการเดียวไม่เคยมีประสิทธิภาพในการรับมือกับปริมาณงานที่เพิ่มขึ้นของแอปพลิเคชัน ดังนั้น อาจมีบางสถานการณ์ที่นักพัฒนาจำเป็นต้องสร้างกระบวนการใหม่ ทำงานกับงานระยะยาว และเปิดใช้งานการโต้ตอบกับระบบปฏิบัติการ ซึ่งสามารถทำได้โดยการสร้างกระบวนการลูกเพื่อใช้กระบวนการต่างๆ ดังนั้นจึงเป็นการปรับขนาดแอปพลิเคชันโหนด
บทความนี้จะอธิบายเนื้อหาตามรายการด้านล่าง:
- กระบวนการเด็กคืออะไร?
- จะสร้างกระบวนการลูกใน Node.js ได้อย่างไร
- การสร้างกระบวนการลูกใน node.js ผ่านทาง “ วางไข่() ' วิธี.
- การสร้างกระบวนการลูกใน node.js โดยใช้ “ ส้อม() ' วิธี.
- การสร้างกระบวนการลูกใน node.js โดยใช้ “ ผู้บริหาร() ' วิธี.
- การสร้างกระบวนการลูกใน node.js โดยใช้ “ เอ็กเซ็กไฟล์() ' วิธี.
กระบวนการเด็กคืออะไร?
กระบวนการลูกสอดคล้องกับกระบวนการที่สร้างขึ้นผ่านกระบวนการอื่น เช่น พาเรนต์ Node.js ให้ “ เด็ก_กระบวนการ ” โมดูลที่ช่วยให้มั่นใจได้ถึงการสื่อสารที่มีประสิทธิภาพระหว่างกระบวนการลูก นอกจากนี้ โมดูลนี้ยังช่วยในการเรียกใช้คุณลักษณะของระบบปฏิบัติการโดยดำเนินการคำสั่งระบบใดๆ ภายในกระบวนการลูก
จะสร้างกระบวนการลูกใน Node.js ได้อย่างไร
เด็กจะประมวลผลใน “ node.js ” สามารถสร้างได้ด้วยวิธีดังต่อไปนี้:
- “ วางไข่() ' วิธี.
- “ ส้อม() ' วิธี.
- “ ผู้บริหาร() ' วิธี.
- “ เอ็กเซ็กไฟล์() ' วิธี.
แนวทางที่ 1: การสร้างกระบวนการลูกใน node.js ผ่านวิธีการ 'วางไข่ ()'
“ วางไข่() ” วิธีการสร้าง cmdlet ในกระบวนการใหม่โดยใช้ cmdlet ที่ให้มาและอาร์กิวเมนต์บรรทัดคำสั่ง อินสแตนซ์ ChildProcess ใช้/ปรับใช้ EventEmitter API ซึ่งอนุญาตให้ลงทะเบียนตัวจัดการสำหรับเหตุการณ์บนออบเจ็กต์ลูก เหตุการณ์เหล่านี้รวมถึงการออก ยกเลิกการเชื่อมต่อ ข้อผิดพลาด ข้อความ และการปิด
ไวยากรณ์
เด็ก_กระบวนการ วางไข่ ( cmdlet [ , หาเรื่อง ] [ , ตัวเลือก ] )ในรูปแบบนี้:
- cmdlet: ต้องใช้สตริงซึ่งเป็น cmdlet เพื่อดำเนินการ
- หาเรื่อง: มันอ้างถึงรายการอาร์กิวเมนต์สตริง ค่าเริ่มต้นคืออาร์เรย์ว่าง
- “ ตัวเลือก ” อาจเป็น “เชลล์” ที่ใช้ค่าบูลีน เป็นเช่นนั้นหากเป็น “ จริง ” cmdlet จะถูกดำเนินการจากภายในเชลล์ ค่าเริ่มต้นคือ “ เท็จ ” ซึ่งหมายถึงไม่มีเปลือก โดยค่าเริ่มต้น, ' วางไข่() ” ไม่ได้สร้าง/สร้างเชลล์เพื่อเรียกใช้ cmdlet ดังนั้นจึงจำเป็นอย่างยิ่งที่จะต้องส่งต่อให้เป็น “ตัวเลือก” ในขณะที่เข้าถึงกระบวนการลูก
มูลค่าส่งคืน: วิธีการนี้ดึงข้อมูลวัตถุ ChildProcess
ต่อไปนี้เป็นการสาธิตการสร้างกระบวนการลูก:
ค่าคงที่ { วางไข่ } = จำเป็นต้อง ( 'เด็ก_กระบวนการ' ) ;ค่าคงที่ เด็ก = วางไข่ ( 'คุณ' , [ 'ง: \ส เอทูปส์' ] , { เปลือก : : จริง } ) ;
เด็ก. มาตรฐาน . บน ( 'ข้อมูล' , ( ข้อมูล ) => {
คอนโซล บันทึก ( `stdout : : $ { ข้อมูล } ` ) ;
} ) ;
เด็ก. stderr . บน ( 'ข้อมูล' , ( ข้อมูล ) => {
คอนโซล ข้อผิดพลาด ( `stderr : : $ { ข้อมูล } ` ) ;
} ) ;
เด็ก. บน ( 'ปิด' , ( รหัส ) => {
คอนโซล บันทึก ( `กระบวนการย่อยออกด้วยรหัส $ { รหัส } ` ) ;
} ) ;
ในบล็อกโค้ดนี้:
- ก่อนอื่นให้รวม ' เด็ก_กระบวนการ ” โมดูลสำหรับการสร้างกระบวนการลูก
- หลังจากนั้นให้วางกระบวนการลูกเพื่อแสดงเนื้อหาในเส้นทางที่ระบุเช่น “ D:\SETUP '.
- สุดท้ายนี้ “ ปิด ” เหตุการณ์จะถูกเรียกใช้เมื่อออกจากกระบวนการลูกทั้งหมดและข้อความออกแสดงบนคอนโซล
เอาท์พุต
ที่นี่ ดำเนินการ cmdlet ต่อไปนี้เพื่อเรียกใช้โค้ดและแสดงเนื้อหาในเส้นทางเป้าหมาย:
อุณหภูมิโหนด เจส
แนวทางที่ 2: การสร้างกระบวนการลูกใน node.js โดยใช้วิธี “fork()”
วิธีการนี้เกี่ยวข้องกับ “ วางไข่() ” วิธีการที่การสื่อสารระหว่างกระบวนการลูกและผู้ปกครองสามารถดำเนินการได้ผ่านทาง “ ส่ง() ' วิธี.
“ ส้อม() ” วิธีการแยกงานการคำนวณที่ซับซ้อนออกจากลูปเหตุการณ์ (หลัก) วิธีนี้สามารถใช้ในการเข้าถึงกระบวนการย่อยได้หลายกระบวนการ แต่อาจส่งผลต่อประสิทธิภาพโดยรวมได้ เนื่องจากแต่ละกระบวนการมีหน่วยความจำของตัวเอง
ไวยากรณ์
เด็ก_กระบวนการ ส้อม ( MDPATH [ , หาเรื่อง ] [ , ตัวเลือก ] )ตามไวยากรณ์นี้:
- “ MDPATH ” รับสตริงที่แสดงถึงโมดูลเพื่อดำเนินการในเด็ก
- “ หาเรื่อง ” หมายถึงรายการอาร์กิวเมนต์สตริง
- “ ตัวเลือก ” สามารถเป็น “execPath”, “env”, “CWD”, “แยกออก” และ “execArgv”
มูลค่าส่งคืน: วิธีการนี้ดึงข้อมูลอินสแตนซ์ ChildProcess
รหัส (กระบวนการหลัก)
ตอนนี้ ไปตามบล็อกโค้ดด้านล่างที่ช่วยให้สามารถสื่อสารระหว่างกระบวนการผู้ปกครองและลูกด้วยความช่วยเหลือของ ' ส่ง() ' วิธี:
ค่าคงที่ ซีพี = จำเป็นต้อง ( 'เด็ก_กระบวนการ' ) ;ปล่อยให้เด็ก = ซีพี ส้อม ( __ชื่อ + '/fork2.js' ) ;
เด็ก. บน ( 'ข้อความ' , การทำงาน ( x ) {
คอนโซล บันทึก ( 'กระบวนการหลักได้รับ:' , x ) ;
} ) ;
เด็ก. ส่ง ( { สวัสดี : : 'จากกระบวนการผู้ปกครอง' } ) ;
เด็ก. บน ( 'ปิด' , ( รหัส ) => {
คอนโซล บันทึก ( `กระบวนการย่อยออกด้วยรหัส $ { รหัส } ` ) ;
} ) ;
ในรหัสนี้:
- ในทำนองเดียวกันให้รวม ' เด็ก_กระบวนการ ” โมดูลสำหรับการสร้างกระบวนการลูก
- ตอนนี้ให้ระบุเส้นทางของกระบวนการลูกผ่านทาง ' ส้อม() ' วิธี.
- สุดท้ายนี้ แสดงข้อความที่แสดงถึงกระบวนการหลักผ่านทางปุ่ม “ ส่ง() ” และแสดงข้อผิดพลาดที่พบหากมี
รหัส (กระบวนการย่อย)
ไฟล์รหัสต่อไปนี้คือ “ fork2.js ” หมายถึงกระบวนการลูกที่ส่งข้อความโดยใช้ “ ส่ง() ” วิธีการดังต่อไปนี้:
กระบวนการ. บน ( 'ข้อความ' , การทำงาน ( ม ) {คอนโซล บันทึก ( 'กระบวนการลูกได้รับ:' , ม ) ;
} ) ;
กระบวนการ. ส่ง ( { สวัสดี : : 'จากกระบวนการลูก' } ) ;
เอาท์พุต
ตอนนี้ให้รัน cmdlet ที่ระบุด้านล่างเพื่อรันโค้ด:
โหนด forkchild เจส
จากผลลัพธ์นี้ ได้รับการยืนยันว่าการสื่อสารระหว่างกระบวนการหลักและลูกได้รับการดำเนินการอย่างเหมาะสม
แนวทางที่ 3: การสร้างกระบวนการลูกใน node.js โดยใช้วิธี “exec()”
“ ผู้บริหาร() ” ขั้นแรกให้สร้างเชลล์แล้วรัน cmdlet วิธีนี้จะใช้เพื่อดึงข้อมูลไดเร็กทอรีทั้งหมด
ไวยากรณ์
เด็ก_กระบวนการ ผู้บริหาร ( cmdlet [ , ตัวเลือก ] [ , โทรกลับ ] )ในไวยากรณ์ที่กำหนด:
- “ cmdlet ” รับสตริงที่แสดงถึงคำสั่งเพื่อดำเนินการกับอาร์กิวเมนต์ที่คั่นด้วยช่องว่าง
- “ ตัวเลือก ” รวมถึง “cwd”, “การเข้ารหัส”, “เชลล์” ฯลฯ
- “ โทรกลับ ” จะถูกเรียกใช้เมื่อกระบวนการ/การดำเนินการสิ้นสุดลง
ค่าส่งคืน
วิธีการนี้ดึงข้อมูลอินสแตนซ์ ChildProcess
ตอนนี้ไปยังโค้ดที่แสดงจำนวนไดเร็กทอรี:
ค่าคงที่ { ผู้บริหาร } = จำเป็นต้อง ( 'เด็ก_กระบวนการ' ) ;ผู้บริหาร ( 'ผบ | ค้นหา /c /v ''' , ( ข้อผิดพลาด stdout stderr ) => {
ถ้า ( ข้อผิดพลาด ) {
คอนโซล ข้อผิดพลาด ( `ข้อผิดพลาดของการดำเนินการ : : $ { ข้อผิดพลาด } ` ) ;
กลับ ;
}
คอนโซล บันทึก ( `stdout : : ตัวเลข ของไดเรกทอรี -> $ { มาตรฐาน } ` ) ;
ถ้า ( stderr != '' )
คอนโซล ข้อผิดพลาด ( `stderr : : $ { stderr } ` ) ;
} ) ;
ในข้อมูลโค้ดนี้ ให้รวม ' เด็ก_กระบวนการ ” โมดูลสำหรับสร้าง/สร้างกระบวนการลูก หลังจากนั้น จัดการกับข้อยกเว้น/ข้อผิดพลาดที่ต้องเผชิญ และแสดงจำนวนไดเร็กทอรีทั้งหมดในไดเร็กทอรีการทำงานปัจจุบัน
เอาท์พุต
ดำเนินการรหัสต่อไปนี้เพื่อเรียกใช้รหัส:
โหนดผู้บริหาร เจส
ในเอาต์พุตนี้ อาจบอกเป็นนัยได้ว่าไดเร็กทอรีทั้งหมดในไดเร็กทอรีการทำงานปัจจุบันจะปรากฏขึ้น
แนวทางที่ 4: การสร้างกระบวนการลูกใน node.js โดยใช้เมธอด execFile()
ใน ' เอ็กเซ็กไฟล์() ” วิธีการ ไฟล์ปฏิบัติการเป้าหมายจะถูกสร้างขึ้นโดยตรงในรูปแบบของกระบวนการใหม่ ดังนั้นจึงมีประสิทธิภาพมากกว่า “ ผู้บริหาร() ' วิธี. วิธีการนี้จะวางไข่ที่สร้างขึ้น “ execchild.js ” ในรูปแบบกระบวนการใหม่
ไวยากรณ์
เด็ก_กระบวนการ execFile ( ชื่อไฟล์ [ , หาเรื่อง ] [ , ตัวเลือก ] [ , โทรกลับ ] )ในไวยากรณ์ที่กำหนด:
- “ ชื่อไฟล์ ” รับสตริงที่แสดงถึงชื่อไฟล์หรือเส้นทางในการดำเนินการ
- “ หาเรื่อง ” สอดคล้องกับรายการอาร์กิวเมนต์สตริง
- “ ตัวเลือก ” รวมถึง “cwd”, “การเข้ารหัส”, “เชลล์” ฯลฯ
- “ โทรกลับ ” จะถูกเรียกใช้เมื่อกระบวนการสิ้นสุดลง อาร์กิวเมนต์ของฟังก์ชันอาจเป็นข้อผิดพลาด stdout ฯลฯ
ค่าส่งคืน
วิธีนี้ยังดึงข้อมูลอินสแตนซ์ ChildProcess
ตอนนี้ ให้พิจารณาโค้ดต่อไปนี้ที่สร้างไฟล์ปฏิบัติการเป้าหมายเป็นกระบวนการใหม่:
ค่าคงที่ { execFile } = จำเป็นต้อง ( 'เด็ก_กระบวนการ' ) ;ค่าคงที่ x = execFile ( 'โหนด' , [ 'execchild.js' ] ,
( ข้อผิดพลาด stdout stderr ) => {
ถ้า ( ข้อผิดพลาด ) {
โยน ข้อผิดพลาด ;
}
คอนโซล บันทึก ( มาตรฐาน ) ;
} ) ;
ขึ้นอยู่กับบรรทัดรหัสเหล่านี้ ใช้ขั้นตอนต่อไปนี้:
- ทำซ้ำขั้นตอนที่กล่าวถึงเพื่อรวม ' เด็ก_กระบวนการ ' โมดูล.
- ในขั้นตอนถัดไป ให้ใช้ ' เอ็กเซ็กไฟล์() ” ที่สร้างไฟล์ปฏิบัติการที่ระบุ (ตามที่กล่าวไว้ในแนวทางก่อนหน้า) เป็นกระบวนการใหม่ ดังนั้นจึงแสดงรายการไดเร็กทอรีทั้งหมดในไดเร็กทอรีการทำงาน
เอาท์พุต
ดำเนินการ cmdlet ด้านล่างเพื่อเรียกใช้โค้ด:
โหนด execfile. เจส
ในผลลัพธ์นี้ สามารถตรวจสอบได้ว่าไฟล์ปฏิบัติการที่ระบุถูกสร้างขึ้นและจำนวนไดเร็กทอรีแสดงขึ้น
บทสรุป
กระบวนการลูกใน Node.js สามารถสร้างได้ผ่านทาง “ วางไข่() ” วิธีการ “ ส้อม() ” วิธีการ “ ผู้บริหาร() ” วิธีการหรือ “ เอ็กเซ็กไฟล์() ' วิธี. วิธีการเหล่านี้วางไข่กระบวนการลูก เปิดใช้งานการสื่อสารกระบวนการแม่ลูก หรือลงรายการไดเร็กทอรีในไดเร็กทอรีการทำงานปัจจุบัน (โดยตรงหรือผ่านการวางไข่ไฟล์ปฏิบัติการเป้าหมาย) ตามลำดับ