Latest web development tutorials

Node.js กระบวนการหลาย

เราทุกคนรู้ว่า Node.js เป็นโหมดเธรดเดียว แต่มันถูกนำมาใช้ในการจัดการพร้อมกันเหตุการณ์ที่ขับเคลื่อนด้วยซึ่งจะช่วยให้เราสร้างกระบวนการย่อยหลายในระบบ CPU แบบ multi-core ซึ่งช่วยเพิ่มประสิทธิภาพการทำงาน

เด็กแต่ละคนมีเสมอกับวัตถุสามไหล: child.stdin, child.stdout และ child.stderr พวกเขาอาจจะใช้การปกครองกระแส stdio หรือมันยังสามารถนำวัตถุกระแสอิสระ

โหนดให้โมดูล child_process เพื่อสร้างกระบวนการเด็กโดย:

  • exec - ใช้เรียกกระบวนการเด็ก child_process.execบัฟเฟอร์ผลผลิตกระบวนการเด็กและการส่งออกของกระบวนการเด็กจะถูกส่งกลับในรูปแบบของพารามิเตอร์ฟังก์ชันการเรียกกลับ

  • วางไข่ - child_process.spawn โดยใช้พารามิเตอร์บรรทัดคำสั่งที่ระบุในการสร้างกระบวนการใหม่

  • ส้อม - child_process.fork จะวางไข่ () รูปแบบพิเศษสำหรับโมดูลที่ทำงานอยู่ในเด็กเช่นส้อม ( './ son.js') สอดคล้องกับการวางไข่ ( 'โหน' [ ' ./son.js' ])ความแตกต่างคือวิธีการวางไข่ส้อมในระหว่างผู้ปกครองและเด็กกระบวนการสร้างท่อร้อยสายสื่อสารสำหรับการสื่อสารระหว่างกระบวนการ


exec () วิธีการ

ใช้เรียกกระบวนการเด็ก child_process.exec, บัฟเฟอร์เอาต์พุตกระบวนการเด็กและการส่งออกของกระบวนการเด็กจะถูกส่งกลับในรูปแบบของพารามิเตอร์ฟังก์ชันการเรียกกลับ

ไวยากรณ์เป็นดังนี้:

child_process.exec(command[, options], callback)

พารามิเตอร์

พารามิเตอร์มีดังนี้

คำสั่ง: String คำสั่งในการเรียกใช้พารามิเตอร์คั่นด้วยช่องว่าง

ตัวเลือก: วัตถุสามารถ:

  • CWD ไดเรกทอรีการทำงานปัจจุบันสตริงกระบวนการเด็ก
  • env วัตถุของตัวแปรด้านสิ่งแวดล้อมที่สำคัญ
  • การเข้ารหัสสตริงเข้ารหัสอักขระ (ค่าเริ่มต้น: 'utf8')
  • เปลือกสตริงเพื่อดำเนินการคำสั่งเชลล์ (ค่าเริ่มต้น: บน UNIX เป็น /bin/sh เช่นใน Windows cmd.exe เชลล์ควรจะสามารถที่จะระบุ -c สวิทช์ใน UNIX หรือ /s /c ใน Windows ใน Windows บรรทัดคำสั่งแยกจะเข้ากันได้ cmd.exe )
  • หมดเวลาดิจิตอลหมดเวลา (ค่าเริ่มต้น: 0)
  • maxBuffer ดิจิตอลบัฟเฟอร์สูงสุด stdout หรือ stderr ได้รับอนุญาตให้อยู่ (binary) ดังนั้นหากเด็กจะถูกฆ่าตายเกิน (ค่าเริ่มต้น: 200 * 1024)
  • killSignal ปลายสตริงสัญญาณ (ค่าเริ่มต้น: 'SIGTERM')
  • UID ดิจิตอลตั้งรหัสผู้ใช้ของกระบวนการ
  • GID ดิจิตอลกลุ่มกระบวนการตั้งรหัส

โทรกลับ: ฟังก์ชันการเรียกกลับมีสามข้อโต้แย้งข้อผิดพลาด stdout และ stderr

exec () วิธีการส่งกลับบัฟเฟอร์สูงสุดและรอสิ้นกระบวนการเพียงครั้งเดียวกลับเนื้อหาของบัฟเฟอร์

ตัวอย่าง

Let 's สร้างสองไฟล์ JS support.js และ master.js

รหัสไฟล์ support.js:

console.log("进程 " + process.argv[2] + " 执行。" );

รหัสไฟล์ master.js:

const fs = require('fs');
const child_process = require('child_process');

for(var i=0; i<3; i++) {
   var workerProcess = child_process.exec('node support.js '+i,
      function (error, stdout, stderr) {
         if (error) {
            console.log(error.stack);
            console.log('Error code: '+error.code);
            console.log('Signal received: '+error.signal);
         }
         console.log('stdout: ' + stdout);
         console.log('stderr: ' + stderr);
      });

      workerProcess.on('exit', function (code) {
      console.log('子进程已退出,退出码 '+code);
   });
}

การดำเนินงานของโค้ดข้างต้นผลลัพธ์คือ:

$ node master.js 
子进程已退出,退出码 0
stdout: 进程 1 执行。

stderr: 
子进程已退出,退出码 0
stdout: 进程 0 执行。

stderr: 
子进程已退出,退出码 0
stdout: 进程 2 执行。

stderr: 

วางไข่ () วิธีการ

child_process.spawn โดยใช้พารามิเตอร์บรรทัดคำสั่งที่ระบุในการสร้างกระบวนการใหม่ไวยากรณ์เป็นดังนี้:

child_process.spawn(command[, args][, options])

พารามิเตอร์

พารามิเตอร์มีดังนี้

คำสั่ง: คำสั่งเรียก

args อาร์เรย์สตริงพารามิเตอร์อาร์เรย์

ตัวเลือกวัตถุ

  • CWD String ไดเรกทอรีปัจจุบันการทำงานของกระบวนการเด็ก
  • สภาพแวดล้อมวัตถุ env ตัวแปรคู่ค่าคีย์
  • อาร์เรย์ stdio | กระบวนการย่อยการกำหนดค่า stdio สตริง
  • บูลีนแฝดเด็กคนนี้จะกลายเป็นผู้นำกลุ่มกระบวนการ
  • จำนวนโพสต์ในการตั้งรหัสผู้ใช้ของกระบวนการ
  • GID จำนวนชุดรหัสกลุ่มกระบวนการ

วางไข่ () วิธีการส่งกลับกระแส (stdout และ stderr) ที่ใช้ในกระบวนการที่จะส่งกลับข้อมูลจำนวนมาก เมื่อกระบวนการเริ่มต้นเมื่อวางไข่ () เริ่มที่จะได้รับการตอบสนอง

ตัวอย่าง

Let 's สร้างสองไฟล์ JS support.js และ master.js

รหัสไฟล์ support.js:

console.log("进程 " + process.argv[2] + " 执行。" );

รหัสไฟล์ master.js:

const fs = require('fs');
const child_process = require('child_process');
 
for(var i=0; i<3; i++) {
   var workerProcess = child_process.spawn('node', ['support.js', i]);

   workerProcess.stdout.on('data', function (data) {
      console.log('stdout: ' + data);
   });

   workerProcess.stderr.on('data', function (data) {
      console.log('stderr: ' + data);
   });

   workerProcess.on('close', function (code) {
      console.log('子进程已退出,退出码 '+code);
   });
}

การดำเนินงานของโค้ดข้างต้นผลลัพธ์คือ:

$ node master.js stdout: 进程 0 执行。

子进程已退出,退出码 0
stdout: 进程 1 执行。

子进程已退出,退出码 0
stdout: 进程 2 执行。

子进程已退出,退出码 0

วิธีส้อม

child_process.fork เป็นรูปแบบพิเศษของการวางไข่ () วิธีการในการสร้างกระบวนการไวยากรณ์เป็นดังนี้:

child_process.fork(modulePath[, args][, options])

พารามิเตอร์

พารามิเตอร์มีดังนี้

modulePath: สตริงที่จะทำงานในโมดูลกระบวนการเด็ก

args อาร์เรย์สตริงพารามิเตอร์อาร์เรย์

ตัวเลือก: วัตถุ

  • CWD String ไดเรกทอรีปัจจุบันการทำงานของกระบวนการเด็ก
  • สภาพแวดล้อมวัตถุ env ตัวแปรคู่ค่าคีย์
  • execPath String สร้างกระบวนการเด็กของแฟ้มที่ปฏิบัติการ
  • พารามิเตอร์สตริงอาร์เรย์ execArgv อาร์เรย์ของเด็กแฟ้มที่ปฏิบัติการ (ค่าเริ่มต้น: process.execArgv)
  • ถ้าบูลีนเงียบ true , เด็ก stdin , stdout และ stderr จะเชื่อมโยงกับการปกครองมิฉะนั้นพวกเขาจะได้รับการสืบทอดมาจากการปกครอง (เริ่มต้น: false )
  • จำนวนโพสต์ในการตั้งรหัสผู้ใช้ของกระบวนการ
  • GID จำนวนชุดรหัสกลุ่มกระบวนการ

วัตถุกลับนอกเหนือไปจากวิธีการทั้งหมดที่มีอินสแตนซ์ ChildProcess มีช่องทางการสื่อสารในตัว

h3> ตัวอย่าง

Let 's สร้างสองไฟล์ JS support.js และ master.js

รหัสไฟล์ support.js:

console.log("进程 " + process.argv[2] + " 执行。" );

รหัสไฟล์ master.js:

const fs = require('fs');
const child_process = require('child_process');
 
for(var i=0; i<3; i++) {
   var worker_process = child_process.fork("support.js", [i]);	

   worker_process.on('close', function (code) {
      console.log('子进程已退出,退出码 ' + code);
   });
}

การดำเนินงานของโค้ดข้างต้นผลลัพธ์คือ:

$ node master.js 
进程 0 执行。
子进程已退出,退出码 0
进程 1 执行。
子进程已退出,退出码 0
进程 2 执行。
子进程已退出,退出码 0