رشتههای کاری
در نود.جیاس، رشتههای کاری (Worker Threads) یک ابزار حیاتی برای اجرای موازی عملیات محاسباتی سنگین بدون مسدود کردن حلقهی اصلی رویداد هستند. به طور پیشفرض، نود.جیاس تکریسمانی (single-threaded) عمل میکند و عملیات CPU-intensive میتوانند عملکرد برنامه و پاسخگویی به درخواستها را کاهش دهند. رشتههای کاری این امکان را فراهم میکنند که این عملیات در پسزمینه اجرا شوند و حلقهی اصلی آزاد باقی بماند.
استفاده از رشتههای کاری در پروژههای نود.جیاس ضروری است وقتی که نیاز به پردازش دادههای بزرگ، رمزنگاری یا الگوریتمهای پیچیده دارید. ماژول worker_threads در نود.جیاس به توسعهدهندگان اجازه میدهد تا رشتههای مستقل ایجاد کنند، بین آنها پیام رد و بدل کنند و دادهها را به صورت ایمن به اشتراک بگذارند. در این آموزش، شما خواهید آموخت که چگونه رشتههای کاری ایجاد و مدیریت شوند، پیامها ارسال شوند و چگونه از مشکلات رایج مانند نشت حافظه و خطاهای ناکارآمد جلوگیری کنید.
با تسلط بر رشتههای کاری، میتوانید برنامههای نود.جیاس مقیاسپذیر، بهینه و مطابق با معماری مدرن ایجاد کنید. همچنین این مبحث فرصت تمرین مفاهیم پیشرفته مانند ساختار دادهها، الگوریتمها و اصول برنامهنویسی شیءگرا (OOP) را فراهم میکند و مهارتهای شما در حل مسائل پیچیده را بهبود میبخشد.
مثال پایه
textconst { Worker, isMainThread, parentPort } = require('worker_threads');
if (isMainThread) {
console.log('رشته اصلی شروع شد...');
const worker = new Worker(__filename);
worker.on('message', (msg) => {
console.log('پیام از رشته کاری:', msg);
});
worker.on('error', (err) => {
console.error('خطا در رشته کاری:', err);
});
worker.on('exit', (code) => {
console.log(`رشته کاری با کد ${code} بسته شد`);
});
} else {
const numbers = [1, 2, 3, 4, 5];
const squares = numbers.map(n => n * n);
parentPort.postMessage(squares);
}
در این مثال ابتدا بررسی میکنیم که آیا کد در رشته اصلی اجرا میشود یا خیر با استفاده از isMainThread. اگر در رشته اصلی هستیم، یک Worker جدید ایجاد میکنیم که همان فایل را در رشته جداگانه اجرا میکند. رویدادهای 'message'، 'error' و 'exit' برای دریافت پیامها، مدیریت خطاها و اطلاع از پایان رشته کاری تعریف شدهاند.
در بخش Worker، با استفاده از متد map مقادیر آرایه numbers را به توان دو میرسانیم و از parentPort.postMessage برای ارسال نتیجه به رشته اصلی استفاده میکنیم. این مثال نشان میدهد که چگونه عملیات CPU-intensive بدون مسدود کردن رشته اصلی اجرا میشوند و بهترین شیوههای نود.جیاس مانند مدیریت چرخه حیات Worker و handling مناسب خطا رعایت میشوند.
مثال کاربردی
textconst { Worker, isMainThread, parentPort } = require('worker_threads');
class PrimeCalculator {
constructor(limit) {
this.limit = limit;
}
isPrime(n) {
for (let i = 2; i <= Math.sqrt(n); i++) {
if (n % i === 0) return false;
}
return n > 1;
}
calculate() {
const primes = [];
for (let i = 2; i <= this.limit; i++) {
if (this.isPrime(i)) primes.push(i);
}
return primes;
}
}
if (isMainThread) {
const worker = new Worker(__filename);
worker.on('message', (msg) => {
console.log('اعداد اول:', msg);
});
worker.on('error', (err) => console.error('خطا در رشته کاری:', err));
worker.on('exit', (code) => console.log(`رشته کاری با کد ${code} بسته شد`));
} else {
const calculator = new PrimeCalculator(10000);
const primes = calculator.calculate();
parentPort.postMessage(primes);
}
در این مثال پیشرفته، یک کلاس PrimeCalculator ایجاد کردهایم که با استفاده از اصول OOP اعداد اول تا 10,000 را محاسبه میکند. الگوریتم بهینه شده با بررسی تا جذر عدد، کارایی را افزایش میدهد. عملیات محاسباتی در Worker انجام میشود و از طریق parentPort.postMessage به رشته اصلی ارسال میشود. این الگو برای پردازش دادههای بزرگ و برنامههای پیچیده ایدهآل است و نشان میدهد که چگونه میتوان ترکیبی از الگوریتمهای بهینه و OOP را با Worker Threads به کار برد.
بهترین شیوهها برای استفاده از رشتههای کاری در نود.جیاس شامل modular بودن کد، انتخاب ساختار داده و الگوریتم مناسب، مدیریت صحیح خطا، پایان دادن به رشتهها در زمان مناسب و حفظ عدم انسداد رشته اصلی است.
اشتباهات رایج شامل اجرای عملیات سنگین در رشته اصلی، نادیده گرفتن خطاها، استفاده از الگوریتمهای ناکارآمد و ارتباط بیش از حد بین رشتهها است. برای دیباگ میتوان از event های Worker، ابزارهای پروفایلینگ Node.js و تحلیل عملکرد استفاده کرد. برای بهینهسازی، کارها را در چند Worker توزیع کنید، پردازش را به صورت batch انجام دهید و ارتباط بین رشتهها را کاهش دهید. از لحاظ امنیتی، از اجرای کدهای ناشناخته در Worker جلوگیری کرده و دادههای حساس را محافظت کنید.
📊 جدول مرجع
نود.جیاس Element/Concept | Description | Usage Example |
---|---|---|
Worker | نماینده یک رشته کاری مستقل | const worker = new Worker('file.js'); |
isMainThread | بررسی اجرای کد در رشته اصلی | if(isMainThread){ ... } |
parentPort | رابط برای ارتباط با رشته اصلی | parentPort.postMessage(data); |
message | رویداد دریافت پیام از Worker | worker.on('message', (msg)=>{...}); |
error | رویداد مدیریت خطا در Worker | worker.on('error', (err)=>{...}); |
یادگیری رشتههای کاری به توسعهدهندگان نود.جیاس امکان میدهد وظایف محاسباتی سنگین را بدون مسدود کردن حلقه اصلی اجرا کنند و سیستمهای scalable و efficient بسازند. با استفاده از کلاسها، الگوریتمها و ارتباط بین رشتهها میتوان برنامههای پیشرفته و چندوظیفهای ایجاد کرد.
برای گسترش دانش، میتوانید Event Loop optimization، استراتژیهای I/O پیچیده، استفاده از Promises و Async/Await با Worker Threads و الگوهای طراحی multi-threaded را مطالعه کنید. توصیه میشود وظایف محاسباتی را isolate کنید، عملکرد را مانیتور کنید و مدیریت منابع را بهینه نمایید. مستندات رسمی، پروژههای جامعه و تمرینهای عملی به درک بهتر و تسلط بر رشتههای کاری کمک خواهند کرد.
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود