วิธีสร้างกระบวนการลูกใน Node.js

Withi Srang Krabwnkar Luk Ni 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 สามารถสร้างได้ผ่านทาง “ วางไข่() ” วิธีการ “ ส้อม() ” วิธีการ “ ผู้บริหาร() ” วิธีการหรือ “ เอ็กเซ็กไฟล์() ' วิธี. วิธีการเหล่านี้วางไข่กระบวนการลูก เปิดใช้งานการสื่อสารกระบวนการแม่ลูก หรือลงรายการไดเร็กทอรีในไดเร็กทอรีการทำงานปัจจุบัน (โดยตรงหรือผ่านการวางไข่ไฟล์ปฏิบัติการเป้าหมาย) ตามลำดับ