شیء Process در Node.js

شیء process در Node.js اطلاعات و کنترل مربوط به پردازش جاری را فراهم می‌کند. این شیء یک نمونه از EventEmitter است و رویدادهای مختلفی مانند exit, beforeExit, uncaughtException, و سیگنال‌های سیستم را مدیریت می‌کند. همچنین متدها و ویژگی‌های متنوعی برای دسترسی به معماری CPU، آرگومان‌های خط فرمان، حافظه، و تغییر مسیر کاری ارائه می‌دهد.

process events (exit, beforeExit, uncaughtException, warning)process.argv / process.argv0process.arch / process.cwd / process.chdirprocess.cpuUsage / process.availableMemory / process.constrainedMemoryIPC channel (process.channel, disconnect, connected)(SIGINT, SIGTERM, SIGUSR1)

~6 دقیقه مطالعه · آخرین به‌روزرسانی ۹ دی ۱۴۰۴

1. رویدادهای Process


  • beforeExit: زمانی که event loop خالی می‌شود.
  • exit: هنگام خروج پردازش.
  • disconnect: هنگام بسته شدن کانال IPC.
  • message: دریافت پیام از پردازش والد.
  • uncaughtException: خطای بدون مدیریت.
  • unhandledRejection: Promise رد شده بدون catch.
  • warning: هشدارهای سیستمی مانند DeprecationWarning.
  • workerMessage: پیام از worker thread.

2. سیگنال‌ها


پردازش Node.js می‌تواند سیگنال‌های POSIX مانند SIGINT, SIGTERM, SIGUSR1 را دریافت کند. برخی سیگنال‌ها مانند SIGKILL و SIGSTOP غیرقابل مدیریت هستند.


process.on('SIGINT', () => {
  console.log('Received SIGINT');
});

3. ویژگی‌های Process


  • process.arch: معماری CPU.
  • process.argv: آرگومان‌های خط فرمان.
  • process.argv0: مقدار اولیه argv[0].
  • process.cwd(): مسیر کاری فعلی.
  • process.chdir(path): تغییر مسیر کاری.
  • process.config: تنظیمات کامپایل Node.js.
  • process.debugPort: پورت دیباگر.

4. مدیریت حافظه و CPU


  • process.availableMemory(): میزان حافظه آزاد.
  • process.constrainedMemory(): محدودیت حافظه توسط سیستم‌عامل.
  • process.cpuUsage(): زمان مصرف CPU توسط پردازش.

5. ارتباطات IPC


  • process.channel: مرجع کانال IPC.
  • process.connected: وضعیت اتصال IPC.
  • process.disconnect(): بستن کانال IPC.

6. متدهای ویژه


  • process.abort(): خروج فوری و تولید core dump.
  • process.dlopen(): بارگذاری پویا افزونه‌های C++.

نتیجه‌گیری


شیء process در Node.js یکی از مهم‌ترین ابزارها برای مدیریت پردازش جاری است. با استفاده از رویدادها، سیگنال‌ها، و ویژگی‌های آن می‌توان کنترل کامل بر چرخهٔ اجرا، منابع سیستم، و ارتباطات بین‌پردازشی داشت. این قابلیت‌ها برای توسعهٔ برنامه‌های پایدار و مقیاس‌پذیر ضروری هستند.


1. مدیریت محیط و آرگومان‌ها


  • process.env: شیء شامل متغیرهای محیطی کاربر.
  • process.execArgv: آرگومان‌های خاص Node.js هنگام اجرا.
  • process.execPath: مسیر کامل اجرایی Node.js.
  • process.execve(file, args, env): جایگزینی پردازش جاری با پردازش جدید (فقط POSIX).

2. مدیریت خروج پردازش


  • process.exit([code]): خروج فوری با کد مشخص.
  • process.exitCode: تعیین کد خروج برای خروج طبیعی.

بهتر است به جای process.exit() مستقیم، از process.exitCode استفاده شود تا خروج به‌صورت طبیعی انجام شود.


3. ویژگی‌های ساخت Node.js


  • process.features.debug: نشان‌دهندهٔ build دیباگ.
  • process.features.tls: پشتیبانی از TLS.
  • process.features.require_module: امکان بارگذاری ECMAScript modules با require().
  • process.features.typescript: وضعیت پشتیبانی از TypeScript (strip یا transform).

4. مدیریت منابع و Finalization


  • process.finalization.register(ref, callback): ثبت callback هنگام آزادسازی منابع.
  • process.finalization.registerBeforeExit(ref, callback): مشابه بالا اما هنگام رویداد beforeExit.
  • process.finalization.unregister(ref): حذف ثبت قبلی.

این قابلیت برای آزادسازی منابع هنگام خروج پردازش طراحی شده است، اما تضمین نمی‌کند که همیشه اجرا شود.


5. مدیریت منابع فعال


  • process.getActiveResourcesInfo(): لیست منابع فعال که event loop را زنده نگه داشته‌اند.

Before: [ 'TTYWrap', 'TTYWrap' ]
After:  [ 'TTYWrap', 'TTYWrap', 'Timeout' ]

6. بارگذاری ماژول‌های داخلی


  • process.getBuiltinModule(id): بارگذاری ماژول داخلی Node.js بدون نیاز به require().

این قابلیت برای سازگاری با محیط‌های دیگر مفید است.


7. مدیریت شناسه‌های کاربر و گروه (POSIX)


  • process.getegid(): شناسهٔ گروه مؤثر.
  • process.geteuid(): شناسهٔ کاربر مؤثر.
  • process.getgid(): شناسهٔ گروه پردازش.
  • process.getgroups(): لیست شناسه‌های گروه‌های مکمل.

این متدها فقط در سیستم‌های POSIX در دسترس هستند.


نتیجه‌گیری


ویژگی‌ها و متدهای پیشرفتهٔ process در Node.js ابزارهای قدرتمندی برای مدیریت محیط اجرا، منابع، و رفتار پردازش فراهم می‌کنند. استفادهٔ صحیح از این قابلیت‌ها به توسعه‌دهندگان کمک می‌کند تا برنامه‌های پایدارتر، امن‌تر، و قابل کنترل‌تر بسازند.


1. مدیریت شناسه‌های کاربر و گروه


  • process.getuid(): شناسهٔ عددی کاربر پردازش (فقط POSIX).
  • process.initgroups(user, extraGroup): مقداردهی لیست گروه‌ها بر اساس فایل /etc/group (نیازمند دسترسی root یا CAP_SETGID).

2. زمان‌بندی دقیق


  • process.hrtime([time]): زمان واقعی با دقت بالا به‌صورت [ثانیه، نانوثانیه] (نسخه legacy).
  • process.hrtime.bigint(): نسخهٔ جدید با خروجی bigint بر حسب نانوثانیه.

const start = process.hrtime.bigint();
setTimeout(() => {
  const end = process.hrtime.bigint();
  console.log(`Benchmark took ${end - start} nanoseconds`);
}, 1000);

3. ارسال سیگنال‌ها


  • process.kill(pid[, signal]): ارسال سیگنال به پردازش مشخص‌شده. سیگنال پیش‌فرض: SIGTERM.

این متد در واقع یک ارسال‌کنندهٔ سیگنال است و ممکن است رفتار متفاوتی از "کشتن" پردازش داشته باشد.


4. بارگذاری فایل‌های محیطی


  • process.loadEnvFile(path): بارگذاری فایل .env در process.env.

5. ماژول اصلی


  • process.mainModule: جایگزین require.main (منسوخ شده از نسخه 14).

6. مدیریت حافظه


  • process.memoryUsage(): اطلاعات کامل مصرف حافظه (rss, heapTotal, heapUsed, external, arrayBuffers).
  • process.memoryUsage.rss(): مقدار RSS به‌صورت سریع‌تر.

console.log(process.memoryUsage());
// { rss: 4935680, heapTotal: 1826816, heapUsed: 650472, ... }

7. چرخهٔ رویداد


  • process.nextTick(callback): افزودن callback به صف "next tick".

این متد قبل از ادامهٔ event loop اجرا می‌شود و برای هماهنگ‌سازی رفتار async بسیار مهم است. جایگزین مدرن: queueMicrotask().


نتیجه‌گیری


متدهای پیشرفتهٔ process در Node.js ابزارهای قدرتمندی برای مدیریت دقیق پردازش، حافظه، زمان‌بندی، و منابع سیستم فراهم می‌کنند. استفادهٔ صحیح از این قابلیت‌ها به توسعه‌دهندگان کمک می‌کند تا برنامه‌های پایدارتر، امن‌تر، و قابل کنترل‌تر بسازند.


1. تفاوت queueMicrotask() و process.nextTick()


  • process.nextTick(): callbackها را در صف "next tick" قرار می‌دهد و قبل از microtask queue اجرا می‌شوند (در CJS).
  • queueMicrotask(): از microtask queue استفاده می‌کند، مشابه Promise handlers (then, catch, finally).
  • در ماژول‌های ESM، چون خودشان بخشی از microtask queue هستند، queueMicrotask() قبل از process.nextTick() اجرا می‌شود.

Promise.resolve().then(() => console.log('resolve'));
queueMicrotask(() => console.log('microtask'));
process.nextTick(() => console.log('nextTick'));
// Output:
// nextTick
// resolve
// microtask

2. مزایا و معایب


  • قابلیت حمل: queueMicrotask() در همهٔ محیط‌های جاوااسکریپت قابل استفاده است.
  • انعطاف: process.nextTick() امکان ارسال آرگومان به callback دارد.
  • مدیریت خطا: خطاهای microtask باید در همان callback مدیریت شوند، در غیر این صورت به uncaughtException می‌رسند.

3. ویژگی‌های مرتبط با process


  • process.pid: شناسهٔ پردازش جاری.
  • process.ppid: شناسهٔ پردازش والد.
  • process.platform: پلتفرم سیستم‌عامل (linux, win32, darwin, ...).
  • process.permission.has(scope[, reference]): بررسی دسترسی‌ها هنگام فعال بودن Permission Model.

4. گزارش‌دهی و عیب‌یابی


  • process.report.getReport(): تولید گزارش تشخیصی به‌صورت شیء جاوااسکریپت.
  • process.report.writeReport(): نوشتن گزارش در فایل یا stdout/stderr.
  • گزینه‌هایی مانند reportOnFatalError, reportOnUncaughtException برای تولید خودکار گزارش‌ها.

5. استفاده از منابع


  • process.resourceUsage(): اطلاعات دقیق دربارهٔ مصرف منابع (CPU, RSS, page faults, context switches).

{
  userCPUTime: 82872,
  systemCPUTime: 4143,
  maxRSS: 33164,
  minorPageFault: 2469,
  fsWrite: 8,
  voluntaryContextSwitches: 79
}

6. مدیریت شناسه‌های کاربر و گروه (POSIX)


  • process.setuid(id): تغییر شناسهٔ کاربر.
  • process.setgid(id): تغییر شناسهٔ گروه.
  • process.seteuid(id) / process.setegid(id): تغییر شناسه‌های مؤثر.
  • process.setgroups(groups): تغییر گروه‌های مکمل.

7. ورودی/خروجی پردازش


  • process.stdin: جریان ورودی (fd 0).
  • process.stdout: جریان خروجی (fd 1).
  • process.stderr: جریان خطا (fd 2).

رفتار این جریان‌ها ممکن است synchronous یا asynchronous باشد بسته به نوع مقصد (فایل، TTY، pipe).


نتیجه‌گیری


در Node.js، انتخاب بین queueMicrotask() و process.nextTick() بستگی به نیاز دارد. برای قابلیت حمل و سازگاری با سایر محیط‌ها، queueMicrotask() انتخاب بهتری است. اما اگر نیاز به ارسال آرگومان یا کنترل دقیق‌تر چرخهٔ رویداد دارید، process.nextTick() می‌تواند مفید باشد. در کنار این، ویژگی‌های دیگر شیء process ابزارهای قدرتمندی برای مدیریت منابع، گزارش‌دهی، و کنترل سطح سیستم فراهم می‌کنند.


نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

آشنایی کامل با ماژول Cluster در Node.js و نحوه افزایش مقیاس‌پذیری سرور

ماژول Cluster در Node.js به توسعه‌دهندگان اجازه می‌دهد چندین پردازش همزمان ایجاد کنند که یک پورت سرور را به اشتراک می‌گذارند. این کار باعث استفاده بهتر از هسته‌های CPU و افزایش توان پردازش برنامه می‌شود. در این مقاله نحوه کار Cluster، مدیریت Workerها، تنظیمات مهم و مثال عملی را بررسی می‌کنیم.

ادامه

راهنمای جامع ماژول VM در Node.js (ماژول node:vm)

ماژول node:vm امکان کامپایل و اجرای کد جاوااسکریپت در کانتکست‌های ایزولهٔ V8 را فراهم می‌کند. این کانتکست‌ها مانند یک «سندباکس سبک» داخل برنامهٔ Node.js عمل می‌کنند و هرکدام globalThis مخصوص خود را دارند. این ماژول برای اجرای پویا، موتورهای قالب (Template Engines)، سیستم‌های افزونه (Plugin Systems)، REPLها و تست ایزولهٔ منطق بسیار مناسب است. اما نکتهٔ بسیار مهم: vm یک ابزار امنیتی نیست و نباید برای اجرای کدهای غیرقابل‌اعتماد استفاده شود.

ادامه

راهنمای جامع ماژول V8 در Node.js (ماژول node:v8)

راهنمای جامع ماژول V8 در Node.js (ماژول node:v8)

ادامه

راهنمای جامع Worker Threads در Node.js (ماژول node:worker_threads)

ماژول node:worker_threads امکان اجرای واقعی چندریسمانی (Multithreading) را در Node.js فراهم می‌کند. برخلاف مدل تک‌ریسمانی سنتی Node.js، Worker Threads اجازه می‌دهند کارهای سنگین CPU در ریسه‌های جداگانه اجرا شوند بدون اینکه حلقهٔ رویداد (Event Loop) مسدود شود. این ماژول از حافظهٔ اشتراکی، انتقال بدون کپی (Zero‑Copy)، کانال‌های پیام، Worker Pool، محدودیت منابع و ابزارهای همگام‌سازی پیشرفته پشتیبانی می‌کند. Worker Threads برای پردازش‌های محاسباتی سنگین ایده‌آل هستند، در حالی که I/O همچنان باید توسط ریسهٔ اصلی مدیریت شود.

ادامه

راهنمای جامع ماژول util در Node.js

ماژول node:util مجموعه‌ای از توابع کمکی قدرتمند برای استفاده در هستهٔ Node.js و همچنین توسعهٔ برنامه‌ها ارائه می‌دهد. این ماژول ابزارهایی برای دیباگ، بازرسی اشیا، تبدیل Callback ↔ Promise، قالب‌بندی رشته‌ها، بررسی انواع، مدیریت خطاها، رمزگذاری متن، پردازش MIME، پارس آرگومان‌های CLI، سیگنال‌های Abort، و ابزارهای متفرقه فراهم می‌کند. این ماژول یکی از جعبه‌ابزارهای اصلی و ضروری برای توسعه‌دهندگان Node.js است.

ادامه

راهنمای جامع ماژول URL در Node.js

ماژول node:url ابزارهایی برای تحلیل، ساخت، و دست‌کاری URLها در Node.js فراهم می‌کند. Node.js دو API برای کار با URL دارد: WHATWG URL API — استاندارد مدرن و سازگار با مرورگرها (توصیه‌شده). Legacy API — API قدیمی Node.js (غیرتوصیه‌شده). WHATWG URL API یک رابط تمیز، سازگار و قدرتمند برای کار با اجزای URL، پارامترهای query، الگوهای URL و حتی Blob URLها ارائه می‌دهد.

ادامه