وقتی از Worker در JS استفاده میکنیم، جاوااسکریپت Multi Thread کار میکند یا شبیه به Multi Thread کار میکند؟
بهتره قبلش بگیم Thread چیه؟
یک مسیر از دستور العمل هاست که توسط CPU اجرا میشه در صورتی که CPU چند هسته ای باشد هر کدام از این Thread ها روی یک هسته اجرا میشن.
آیا میشه چند Thread روی یک هسته در حال اجرا باشند؟
بله میشه ، منتها در این حالت concurrency رخ میده یعنی CPU زمان را بین Threads تقسیم کرده و به نظر میرسد که پردازشها به صورت موازی انجام میشوند.
حالا بریم سراغ جاواسکریپت:
جاوااسکریپت به طور ذاتی Single Thread است، اولین موردی که باید درموردش بدونیم اینه که :
-اولا Thread رو مرورگر از طریق تعامل با سیستمعامل و CPU ایجاد میکند.
-دوما JavaScript Engine فقط کد جاوااسکریپت را اجرا میکند و با مرورگر تعامل میکند. این موتور جاوااسکریپت مدیریت Threads را به سیستمعامل واگذار میکند.
خود فایل های JS ما روی یک Thread اصلی یعنی Main Thread اجرا میشن. وظیفهی این Thread هم اجرای کد جاوااسکریپت، مدیریت رویدادها، و بهروزرسانی DOM هست.
دومین نکته ای که لازمه بگم اینه که worker ها بخشی ازConcurrency Model and Event Loop در Web APIs مرورگر هستند بنابراین وقتی شما از worker استفاده میکنید مرورگر برای هر ورکر یک Thread جدا از Main Thread ایجاد میکنه.
منتها این Thread ها به منابع Main Thread یعنی DOMو ... دسترسی ندارند و تبادل اطلاعات بین انها و Main Thread از طریق Message Passing اتفاق میوفتد یعنی شما باید از طریق ارسال و دریافت پیامها به مرورگر این امکان را بدهید که اطلاعات بین Threads را تبادل کند. بنابراین مشکلاتی مثل Race Condition یا نیاز به Synchronization در سطح Threadها معمولاً به وجود نمیآید.
حالا آیا این Thread ها روی یک هسته CPU اجرا میشن یا چند هسته؟
بستگی به سیستم و CPU شما داره اگر CPU چند هستهای باشد و مرورگر به درستی پیکربندی شده باشد، Threads میتوانند به طور واقعی بر روی هستههای مختلف اجرا شوند. این حالت به Parallelism اشاره دارد، به این معنا که چندین Task به طور همزمان در چندین Thread و هستههای جداگانه اجرا میشوند.
اگر CPU تنها یک هسته داشته باشد، Threads روی همان هسته اجرا میشوند و مرورگر به صورت Concurrent آنها را اجرا میکند. در این حالت، Threads به طور نوبتی (زمانی) اجرا میشوند (به این صورت که بین تسک ها Context Switching انجام میده برای همین شما فکر میکنید که تسک ها دارن همزمان اجرا میشن)، به این معنا که CPU زمان را بین آنها تقسیم میکند. البته به این نکته توجه داشته باشید که مبحث concurrency لزوما فقط در این شرایط رخ نمیدهد کلا concurrency به معنی اجرای همزمان تسک هاست که در یک مقاله دیگه به طور کامل توضیحش میدم.
و نکته نهایی اینه که پیادهسازیهای مختلف مرورگرها ممکن است جزئیات متفاوتی در مدیریت Threads و منابع داشته باشند، بنابراین رفتار ممکن است در مرورگرهای مختلف کمی متفاوت باشد.
امیدوارم با این مقاله تونسته باشم این مفاهیم رو تا حد خوبی توضیح بدم و شفاف کنم.