مقدمه
گاهی اوقات هنگام توسعه برنامههای Node.js نیاز دارید وظایفی را خارج از فرآیند اصلی اجرا کنید. برای مثال ممکن است بخواهید یک اسکریپت پایتون را اجرا کنید، یک فرمان سیستمی را فراخوانی کنید یا پردازشهای سنگین را به فرآیندهای جداگانه منتقل کنید. در چنین شرایطی، Child Processها راهحلی قدرتمند و کاربردی هستند.
ماژول داخلی child_process در Node.js به شما اجازه میدهد فرآیندهای جدیدی ایجاد کرده و با آنها تعامل داشته باشید. این قابلیت برای اجرای دستورات سیستمعامل، پردازش موازی و افزایش کارایی برنامه بسیار مفید است.
در این آموزش یاد میگیرید چگونه Child Processها را در Node.js ایجاد و مدیریت کنید.
Child Process چیست؟
هر برنامه Node.js بهصورت پیشفرض در یک فرآیند (Process) اجرا میشود. با استفاده از ماژول child_process میتوانید فرآیندهای فرعی ایجاد کنید که مستقل از فرآیند اصلی اجرا میشوند.
مزایای استفاده از Child Process:
- اجرای دستورات سیستمعامل
- پردازش همزمان وظایف مختلف
- جلوگیری از بلاک شدن Event Loop
- اجرای برنامههای نوشتهشده با زبانهای دیگر مانند Python و Ruby
- مدیریت بهتر منابع سیستم
وارد کردن ماژول Child Process
ابتدا ماژول داخلی Node.js را فراخوانی کنید:
const { exec } = require('child_process');
اجرای دستورات با exec()
متد exec() برای اجرای دستورات کوتاه و دریافت خروجی آنها مناسب است.
مثال:
const { exec } = require('child_process');
exec('ls -la', (error, stdout, stderr) => {
if (error) {
console.error(`خطا: ${error.message}`);
return;
}
if (stderr) {
console.error(`خطای سیستم: ${stderr}`);
return;
}
console.log(stdout);
});
در این مثال دستور ls -la اجرا شده و خروجی آن نمایش داده میشود.
اجرای فایل با execFile()
اگر میخواهید مستقیماً یک فایل اجرایی را اجرا کنید، execFile() گزینه بهتری است.
const { execFile } = require('child_process');
execFile('node', ['app.js'], (error, stdout) => {
if (error) {
console.error(error);
return;
}
console.log(stdout);
});
مزیت اصلی این روش امنیت بیشتر و عملکرد بهتر نسبت به exec() است.
اجرای فرآیند با spawn()
برای پردازش حجم زیادی از دادهها بهتر است از spawn() استفاده کنید، زیرا دادهها را بهصورت Stream مدیریت میکند.
مثال:
const { spawn } = require('child_process');
const child = spawn('ping', ['google.com']);
child.stdout.on('data', (data) => {
console.log(`خروجی: ${data}`);
});
child.stderr.on('data', (data) => {
console.error(`خطا: ${data}`);
});
child.on('close', (code) => {
console.log(`فرآیند با کد ${code} پایان یافت.`);
});
ایجاد فرآیند Node.js با fork()
متد fork() مخصوص اجرای فایلهای Node.js است و امکان ارتباط مستقیم بین فرآیند والد و فرزند را فراهم میکند.
فایل child.js
process.on('message', (message) => {
console.log('پیام دریافتی:', message);
process.send('سلام از Child Process');
});
فایل اصلی
const { fork } = require('child_process');
const child = fork('./child.js');
child.send('سلام از Parent');
child.on('message', (message) => {
console.log(message);
});
ارسال داده بین فرآیندها
یکی از مهمترین ویژگیهای fork() امکان ارسال پیام بین فرآیندهاست.
child.send({
userId: 1,
action: 'create'
});
در فرآیند فرزند:
process.on('message', (data) => {
console.log(data);
});
مدیریت خطاها
همیشه خطاها را مدیریت کنید تا از توقف ناگهانی برنامه جلوگیری شود.
child.on('error', (error) => {
console.error('خطا:', error);
});
پایان دادن به Child Process
برای متوقف کردن فرآیند فرزند:
child.kill();
یا:
child.kill('SIGTERM');
تفاوت exec، spawn و fork
| متد | کاربرد |
|---|---|
| exec() | اجرای دستورات کوتاه و دریافت خروجی کامل |
| execFile() | اجرای مستقیم فایل اجرایی |
| spawn() | پردازش دادههای حجیم بهصورت Stream |
| fork() | اجرای فایلهای Node.js و ارتباط بین فرآیندها |
بهترین روشها
- برای خروجیهای بزرگ از
spawn()استفاده کنید. - برای فایلهای Node.js از
fork()بهره ببرید. - همیشه خطاها را مدیریت کنید.
- فرآیندهای بلااستفاده را متوقف کنید.
- از اجرای دستورات ورودی کاربر بدون اعتبارسنجی خودداری کنید.
جمعبندی
ماژول child_process در Node.js ابزاری قدرتمند برای اجرای فرآیندهای فرعی و افزایش توان پردازشی برنامهها است. با استفاده از متدهای exec(), execFile(), spawn() و fork() میتوانید وظایف سنگین را از فرآیند اصلی جدا کرده و عملکرد بهتری برای برنامههای خود فراهم کنید. انتخاب متد مناسب به نوع پردازش، حجم داده و نیازهای پروژه بستگی دارد.
از همراهی شما با پارمین کلود سپاسگزاریم.
نظرات کاربران