Node มีหลายเธรด แต่ JavaScript ที่ทำงานบน V8 เป็นเธรดเดี่ยว โมดูล child_process ของ Node ใช้เพื่อสร้างกระบวนการเด็กและเราสามารถใช้ประโยชน์จาก CPU อย่างเต็มที่ผ่านกระบวนการเด็ก ตัวอย่าง:
การคัดลอกรหัสมีดังนี้:
var fork = ต้องการ ('child_process'). fork;
// รับหมายเลข CPU ของเครื่องปัจจุบัน
var cpus = ต้องการ ('os'). cpus ();
สำหรับ (var i = 0; i <cpus.length; i ++) {
// สร้างกระบวนการใหม่
Fork ('./ worker.js');
-
นี่คือวิธีการสร้างกระบวนการรวมถึงส้อม:
1.Spawn (คำสั่ง, [args], [ตัวเลือก]), เริ่มกระบวนการใหม่เพื่อเรียกใช้คำสั่งคำสั่ง, args เป็นพารามิเตอร์บรรทัดคำสั่ง
2.EXEC (คำสั่ง, [ตัวเลือก], การโทรกลับ), เริ่มกระบวนการใหม่เพื่อเรียกใช้คำสั่งคำสั่งเรียกใช้การโทรกลับถูกใช้เพื่อรับอินพุตมาตรฐานเอาต์พุตมาตรฐานและข้อมูลข้อผิดพลาดในตอนท้ายของกระบวนการ
3.ExecFile (ไฟล์, [args], [ตัวเลือก], [callback]), เริ่มกระบวนการใหม่เพื่อเรียกใช้ไฟล์ที่เรียกใช้งานได้ การโทรกลับใช้เพื่อรับอินพุตมาตรฐานเอาต์พุตมาตรฐานและข้อมูลข้อผิดพลาดในตอนท้ายของกระบวนการ
4.Fork (ModulePath, [args], [ตัวเลือก]), เริ่มกระบวนการใหม่เพื่อดำเนินการโมดูลไฟล์ JavaScript และกระบวนการเด็กโหนดถูกสร้างขึ้นในเวลานี้
การสื่อสารระหว่างกันของโหนด
กระบวนการหลัก
การคัดลอกรหัสมีดังนี้:
// parent.js
var fork = ต้องการ ('child_process'). fork;
// fork ส่งคืนวัตถุกระบวนการเด็ก n
var n = fork ('./ child.js');
// จัดการข้อความเหตุการณ์
n.on ('ข้อความ', ฟังก์ชัน (m) {
// รับข้อความที่ส่งโดยกระบวนการเด็ก
console.log ('ได้รับข้อความ:' + m);
-
// ส่งข้อความไปยังกระบวนการเด็ก
N.Send ({Hello: 'World'});
กระบวนการย่อย
การคัดลอกรหัสมีดังนี้:
// child.js
// จัดการข้อความเหตุการณ์
process.on ('ข้อความ', ฟังก์ชัน (m) {
console.log ('ได้รับข้อความ:' + m);
-
// วิธีการส่งมีอยู่สำหรับการส่งข้อความไปยังกระบวนการหลัก
process.send ({foo: 'bar'});
ควรสังเกตว่าวิธีการส่งที่นี่เป็นแบบซิงโครนัสดังนั้นจึงไม่แนะนำให้ส่งข้อมูลจำนวนมาก (คุณสามารถใช้ท่อแทนดู http://nodejs.org/api/all.html#child_process_child_process_spawn_command_args_args_options
ในกรณีพิเศษค่าแอตทริบิวต์ CMD ในข้อความมีคำนำหน้า node_ (ตัวอย่างเช่น: {cmd: 'node_foo'} ข้อความ) จากนั้นข้อความนี้จะไม่ถูกส่งไปยังเหตุการณ์ข้อความ (แต่เหตุการณ์ InternalMessage) และพวกเขาจะถูกใช้ภายในโดย Node
ต้นแบบของวิธีการส่งคือ:
การคัดลอกรหัสมีดังนี้:
ส่ง (ข้อความ [SendHandle])
ที่นี่ SendHandle (ด้ามจับ) สามารถใช้ในการส่ง:
1.NET.Native, ซ็อกเก็ต C ++ TCP หรือไปป์ไลน์
2.Net.Server เซิร์ฟเวอร์ TCP
3.net.socket, ซ็อกเก็ต TCP
4.dgram.native, ซ็อกเก็ต C ++ UDP ดั้งเดิม
5.dgram.socket, ซ็อกเก็ต UDP
ส่งเมื่อส่ง SendHandle ไม่ใช่ (และไม่สามารถ) เพื่อส่งวัตถุ JavaScript โดยตรง แต่เพื่อส่งตัวอธิบายไฟล์ (ในที่สุดก็ส่งเป็นสตริง JSON) กระบวนการอื่น ๆ สามารถกู้คืนวัตถุที่เกี่ยวข้องผ่านตัวบ่งชี้ไฟล์นี้
ตอนนี้ดูตัวอย่าง:
กระบวนการหลัก
การคัดลอกรหัสมีดังนี้:
// parent.js
var fork = ต้องการ ('child_process'). fork;
var n = fork ('./ child.js');
var server = ต้องการ ('net'). createserver ();
Server.Listen (7000, function () {
// ส่งเซิร์ฟเวอร์ TCP ไปยังกระบวนการเด็ก
N.Send ('เซิร์ฟเวอร์', เซิร์ฟเวอร์);
}). on ('การเชื่อมต่อ', function () {
console.log ('การเชื่อมต่อ - พาเรนต์');
-
กระบวนการย่อย
การคัดลอกรหัสมีดังนี้:
process.on ('ข้อความ', ฟังก์ชัน (m, h) {
if (m === 'เซิร์ฟเวอร์') {
h.on ('การเชื่อมต่อ', ฟังก์ชัน () {
console.log ('การเชื่อมต่อ - เด็ก');
-
-
-
การเข้าถึงโปรแกรมนี้ผ่านพอร์ต 7000 อาจส่งผลให้เอาต์พุตเป็นพาเรนต์การเชื่อมต่อหรือลูกเชื่อมต่อ ที่นี่กระบวนการเด็กและกระบวนการหลักฟังพอร์ต 7000 ในเวลาเดียวกัน โดยทั่วไปแล้วกระบวนการหลายกระบวนการที่ฟังพอร์ตเดียวกันจะทำให้เกิดข้อยกเว้น eaddrinuse ในกรณีนี้กระบวนการที่แตกต่างกันสองกระบวนการใช้ตัวบ่งชี้ไฟล์เดียวกันและเลเยอร์พื้นฐานของโหนดตั้งค่าตัวเลือก SO_REUSEADDR บนซ็อกเก็ตเมื่อฟังพอร์ตซึ่งช่วยให้ซ็อกเก็ตนี้ถูกนำกลับมาใช้ใหม่ในกระบวนการที่แตกต่างกัน เมื่อหลายกระบวนการฟังพอร์ตเดียวกันตัวอธิบายไฟล์สามารถใช้งานได้โดยกระบวนการเดียวในเวลาเดียวกันและกระบวนการเหล่านี้ใช้ซ็อกเก็ตอย่างรวดเร็ว
โมดูลคลัสเตอร์
มีการเพิ่มโมดูลคลัสเตอร์ใหม่ลงใน V0.8 ในโหนดซึ่งโมดูลคลัสเตอร์สามารถสร้างกลุ่มของกระบวนการที่ฟังพอร์ตเดียวกันบนเครื่องกายภาพได้อย่างง่ายดาย ตัวอย่าง:
การคัดลอกรหัสมีดังนี้:
var cluster = ต้องการ ('คลัสเตอร์');
var http = ต้องการ ('http');
var numcpus = ต้องการ ('os'). cpus (). ความยาว;
// ตรวจสอบว่ากระบวนการเป็นกระบวนการหลักหรือไม่
if (Cluster.ismaster) {
สำหรับ (var i = 0; i <numcpus; ++ i)
// สร้างกระบวนการคนงานใหม่ (เท่านั้นที่สามารถเรียกกระบวนการหลักได้)
cluster.fork ();
Cluster.on ('Exit', function (คนงาน, รหัส, สัญญาณ) {
console.log ('Worker' + Worker.process.pid + 'Die');
-
} อื่น {
http.createserver (ฟังก์ชั่น (req, res) {
Res.writehead (200);
Res.end ('Hello World/N');
}). ฟัง (8000);
-
เราเรียกวิธีการฟังในกระบวนการของคนงานและคำขอฟังจะถูกส่งผ่านไปยังกระบวนการหลัก หากกระบวนการหลักมีเซิร์ฟเวอร์ที่ฟังเพื่อให้ตรงตามข้อกำหนดของกระบวนการของผู้ปฏิบัติงานการจัดการของเซิร์ฟเวอร์นี้จะถูกส่งผ่านไปยังผู้ปฏิบัติงาน หากไม่มีอยู่กระบวนการหลักจะสร้างหนึ่งแล้วส่งผ่านที่จับไปยังกระบวนการของผู้ปฏิบัติงาน
เอกสารรายละเอียดเพิ่มเติมเกี่ยวกับคลัสเตอร์: http://www.nodejs.org/api/cluster.html