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
เช่นใน Windowscmd.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