English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

NodeJS أساسيات التعليمات

NodeJS Express.js

NodeJS 缓冲&URL;

NodeJS MySql

NodeJS MongoDB

NodeJS ملف (FS)

NodeJS أخرى

معالجة الملفات المتعددة في Node.js

نحن نعلم أن 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 قناة اتصال بين وحدات التشغيل الأم والفرعية، تستخدم للتواصل بين وحدات التشغيل.

مетод exec()

يستخدم 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.

كود ملف 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);
            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:

طريقة spawn()

يستخدم 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.

كود ملف 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

طريقة fork

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.

كود ملف 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