آیا Node.js یک single-threaded محسوب میشه؟
در پست قبل به بررسی اینکه رشته یا thread چی هست پرداختیم، اما در این پست راجب این که رشته ها در Node.js به چه صورت هستن، صحبت میکنیم.
البته قبل از اینکه بدونیم Node.js تک رشته ای هست یا نه، ابتدا باید مفهوم single-threaded و multi-threaded ها رو متوجه بشیم.
single-threaded: اگه شما یک رستوران و یک گارسون داشته باشید، اون گارسون میتونه هربار فقط یک سفارش بگیره، یک غذا رو آماده کنه و به یک مشتری سرویس بده.
multi-threaded: حالا اگه همون رستوران چندتا گارسون داشته باشه، میتونه به صورت مستقل سفارش بیشتری بگیره و خدمات بیشتری ارائه بده.
این توضیح ساده ای از هرکدوم بود، پیشنهاد میکنم این مقاله رو برای اطلاعات بیشتر بخونین :)
اما Node.js واقعا تک رشته ای هست؟
Node.js بخاطر معماری non-blocking و ایونت محور، اغلب باعث این تصور غلط میشه که ذاتا تک رشته ای هست، ولی خب یک نکته ریزه داره که برای درکش، ابتدا باید با ایونت لوپ ها آشنا بشید ⬇️
در قلب Node.js، ایونت لوپ قرار داره و مکانیزمی هست که کالبک ها رو به صورت non-blocking، مدیریت و اجرا میکنه.این تک رشته به صورت مداوم ایونت هایی مثل درخواست های دریافتی، عملیات های I/O تکمیل شده یا منقضی شدن زمان رو بررسی میکنه، و هنگامی که یک ایونت شناسایی شد کالبک فانکشن های مربوطه رو در صف اجرا قرار میده، سپس ایونت لوپ این تماس هارو به ترتیب دریافت، و پردازش میکنه.
قبل از دونستن اینکه نود تک رشته ای هست یا نه، باید راجب این موضوعات اطلاعات داشته باشید:
خاصیت های non-blocking و عملیات I/O:
این عملیات ها، Node.js رو قادر میسازن تا چندین درخواست رو به صورت همزمان و بدون مسدود کردن رشته اصلی مدیریت کنه، و هنگامی که یک درخواست شامل عملیات I/O مانند خوندن یک فایل یا دسترسی به دیتابیس داده باشه، ایونت لوپ وظیفه رو به سیستم عامل واگذار میکنه و به پردازش سایر ایونت ها ادامه میده. هنگامی که عملیات I/O تموم شد، سیستم عامل به ایونت لوپ میگه "کاری که میخواستی تموم شد" و ایونت لوپ یا حلقه رویداد عملکرد برگشت به تماس مربوطه رو انجام میده.
اما همه اینارو گفتم که به این برسم:
درسته که ایونت لوپ بر روی یک تک رشته اجرا میشه، ولی Node.js مکانیزم هایی برای استفاده از چندین هسته CPU، از طریق رشته های کارگر (worker thread) ارائه میده، و رشته های کارگر این اجازه رو میدن تا کارهای طولانی مدت و محاسبات فشرده به رشته های جداگونه واگذار بشه، و از مسدود شدن رشته اصلی جلوگیری میکنن.
به صورت کلی non-blocking، عملیات I/O و رشته های کارگر (worker thread) به Node.js این اجازه رو میدن که چندین درخواست رو به صورت همزمان مدیریت، و به طور موثر از چندین هسته CPU استفاده کنه.
برای اطلاعات بیشتر مقالات زیر رو پیشنهاد میکنم :))
- Article
- Article
- Article
#nodejs #thread