English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
نحن نعلم أن Node.js يعمل في نمط التشغيل المركزي، ولكن يستخدم نظامًا دفعيًا لمعالجة التوازي، مما يساعدنا في إنشاء عدة وحدات تشغيل فرعية على أنظمة CPU متعددة النواة، مما يزيد من الأداء.
تكون كل وحدة تشغيل فرعية دائمًا مصحوبة بثلاثة مجالات تدفق: child.stdin, child.stdout و child.stderr. قد تشارك هذه المجالات تدفقات stdio من وحدة التشغيل الأم، أو يمكن أن تكون مستقلة وتُقود إلى مجالات تدفق مستقلة.
يقدم Node.js وحدة البرمجة child_process لإنشاء وحدات التشغيل الفرعية، ويوجد هناك طرق لذلك:
exec - child_process.exec يستخدم وحدة التشغيل الفرعية لت�行 الأمر، ويحفظ مخرجات وحدة التشغيل الفرعية، ويقوم بتقديم مخرجات وحدة التشغيل الفرعية كمعطيات للوظيفة المقدمة كمعامل.
spawn - child_process.spawn يستخدم لتكوين وحدات التشغيل جديدة باستخدام معطيات سطر الأوامر المحددة.
fork - child_process.fork هو شكل خاص من spawn()، يستخدم لتشغيل وحدات البرمجة في وحدات التشغيل الفرعية، مثل fork('./son.js') هو مثل spawn('node', ['./son.js']). يختلف fork عن طريقة spawn، حيث يبني fork قناة اتصال بين وحدات التشغيل الأم والفرعية، تستخدم للتواصل بين وحدات التشغيل.
يستخدم child_process.exec تنفيذ الأمر الفرعي، ويحفظ输出来 من الفرعي، ويجلب إخراج الفرعي كمعلمات وظيفة التحويل.
النحو كما يلي:
child_process.exec(command[, options], callback)
شرح المعلمات كما يلي:
command: خط،الأمر الذي سيتم تنفيذه، ويمكن استخدام الفراغات لفصل المعلمات
خيارات : مثلث، يمكن أن يكون:
cwd،خط،دليل العملية الفرعية الحالي
env،مثلث،قيم متغيرات البيئة
encoding،خط،رمز الترميز (الافتراض: 'utf8')
shell،خط،الشل الذي سيتم تنفيذه الأمر (الافتراض: /bin/sh في UNIX، cmd.exe في Windows، يجب أن يستطيع الشل التعرف على مفتاح -c في UNIX أو /s /c في Windows. في Windows، يجب أن تكون تحليل سطر الأوامر متوافقة مع cmd.exe)
timeout،رقم،زمن الاستحقاق (الافتراض: 0)
maxBuffer،رقم،الحد الأقصى للمنطقية المخزنة المسموح به في stdout أو stderr (بالنظام الثنائي)، إذا تجاوزت هذا الحد، سيتم قتل عملية الفرعية (الافتراض: 200*1024)
killSignal،خط،إشارة الانتهاء (الافتراض: 'SIGTERM')
uid،رقم،تعيين معرف عملية المستخدم
gid،رقم،تعيين معرف مجموعة العملية
التحويل :وظيفة التحويل، تحتوي على ثلاثة معلمات error, stdout و stderr.
مетод exec() يرجع أكبر منطقية تخزين، وينتظر انتهاء عملية، ويجلب محتويات منطقية المخزنة مرة واحدة.
دعونا ننشئ اثنين من ملفات js support.js و master.js.
console.log("العملية " + process.argv[2] + " تنفيذ." );
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); console.log('استمتع: '+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])
شرح المعلمات كما يلي:
command: الإذن الذي سيتم تشغيله
args: Array مجموعة من أرقام النصوص
options Object
cwd String الدليل الحالي للفرع الفرعي
env Object قيم المتغيرات البيئية
stdio Array|String تكوين stdio للفرع
detached Boolean سيصبح هذا الفرع قائد مجموعة العمليات
uid Number إعداد ID عملية المستخدم
gid Number إعداد ID مجموعة العملية
يعد طريقة spawn() تقدم تيارات (stdout & stderr)، ويستخدم عند عودة عملية كمية كبيرة من البيانات. تبدأ طريقة spawn() في استقبال الاستجابات حالما تبدأ عملية التنفيذ.
دعونا ننشئ اثنين من ملفات js support.js و master.js.
console.log("العملية " + process.argv[2] + " تنفيذ." );
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 هو شكل خاص من طريقة spawn()، يستخدم لإنشاء عملية، نموذج الجملة كما يلي:
child_process.fork(modulePath[, args][, options])
شرح المعلمات كما يلي:
modulePath: String، المodule الذي سيتم تشغيله في الفرع الفرعي
args: Array مجموعة الأنواع النصية للمعاملات
options:Object
cwd String الدليل الحالي للفرع الفرعي
env Object قيم المتغيرات البيئية
execPath String ملف التنفيذ الذي يتم إنشاء الفرع الفرعي
execArgv Array مجموعة الأنواع النصية للمعاملات التي يمكن تنفيذها في الفرع الفرعي (القيمة الافتراضية: process.execArgv)
silent Boolean إذا كان صحيحًا، stdin، stdout و stderr للفرع الفرعي سيتم ربطها مع العملية الأم، وإلا فإنها ستورث من العملية الأم. (القيمة الافتراضية: false)
uid Number إعداد ID عملية المستخدم
gid Number إعداد ID مجموعة العملية
العنصر الذي يعاد إنتاجه يحتوي على جميع طرق ChildProcess بالإضافة إلى قناة اتصال مدمجة.
دعونا ننشئ اثنين من ملفات js support.js و master.js.
console.log("العملية " + process.argv[2] + " تنفيذ." );
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