قصد داشتم اولین مطلبی که تو ویرگول میذارم یکم از خودم بگم، از تجربهی جدید که تو حوزهی توسعهی فرانت بهدست آوردم. از دنیای امنیت که سه ساله توی دریای بیکرانش غرقم و نگرانیهای خودم به عنوان یک زن توی حوزهی فناوری اطلاعات در ایران.
اما امشب اتفاقی افتاد که تصمیم گرفتم این داستان رو اینجا ثبتش کنم هم به عنوان اولین مطلبم هم به عنوان یک مقاله که شاید یه روزی یکی، کمی به دردش بخوره.
دختر یخی رو کما بیش همه تو دنیای توسعهی فرانت میشناسن، این دختر همون دختر مهربونیه که بیشاز اندازه نگران دوستاشه و همیشه با جمع کردن دوستاش دوره هم خاطرههای خیلی قشنگی میسازه. وقتی از اون کمک میخوای اینقدر برات دل میسوزونه که گاهی نگران خودش میشی.امشب به من زنگ زد و کلی غرغر کرد که تو دیگه مثل قبل تلاش نمیکنی. راست میگفت؛ دلیل داشتم اما خوب نمیخواستم بهونه تراشیهم بکنم. آخر صحبتاش گفت برو فلن چیزا رو بخون تا صبح میخوامش. یه چند دقیقه بعد زنگ زد گفت: فرناز میخوام یک Function بنویسی که Multi Thread فلان کارهارو بکنه اونم تو جیاس!!!!!!!!!.
( صب کن ببینم!!! مگه جی اس مالتی ترده اصن؟ نکنه من دارم اشتباه میکنم. اگه میگه پس حتما هست دیگه. میرم سرچ میکنم پیدا میکنم....)
تو یه لحظه به این نتیجه رسیدم که نگم مگه میشه تو جیاس اینکارو کرد؟ و فقط بگم باشه.
این باشهی من هماناها مورد هجوم پیامهای مرگبار قرار گرفتن همانا.
بله!!!! در جاوااسکریپت دوست داشتنی ما نمیتونی مالتی ترد تسک بنویسی!!!!
حالا این یعنی چی؟ از اینجا به بعد میخوام اون چیزی رو که خودم درک کردم از این موضوع بنویسم. این حرف من به این معناست که ممکنه من هنوز اشتباه داشته باشم و قرار نیست حرف من و این مطلب حجت رو برروی شما علاقمندان تموم کنه.
اگه جاییش اشتباه بود به من بگین.
خب! باید با این سوال شروع کنم: اسکریپتها تو جیاس چجوری اجرا میشن؟ و چجوری به اونها حافظه تعلق میگیره؟
فرض کن ما دوتا خط کد جاوااسکریپت داریم. اگه بخوام تسکهای همزمان رو تعریف کنم میشه این که اول خط یک اجرا میشه بعد خط دو. به همین سادگی و این به این معنیه که تا زمانی که خط اول اجرا نشده خط دوم نمیتونه اجرا بشه این یعنی همون سینگل ترد عزیز.
کدهای پایین رو یه نگاه بنداز:
console.log("print1");
console.log("print2");
console.log("print3");
خب تو قدم اول خط اول تو Call Stack اصطلاحا Pushed و اجرا می شه وقتی که تموم شد و اجرا شد از Stack خارج میشه و خط بعدی وارد Stack میشه. همین اتفاق واسه خط دوم و سوم هم میفته و برنامه تموم میشه.
مثالهای خیلی بیشتری هست تو اینترنت که حتما توصیه میکنم بری ببینی و سعی کنی تحلیل کنی.
تسکهای نامتقارن یعنی چی؟
ما گفتیم که تو جیاس همه چی خط به خط اجرا میشه. حالا اگه یه خطی یکم زمان بیشتری بخواد چی؟
همون دو خط کد بالا رو درنظر بگیرین و فرض کنین که خط اول یکم زمان بیشتری از شما خواسته. مثلا دو ثانیه.
خط اول شروع به اجرا شدن میکنه و میره تو بگراند قضیه صبر میکنه تا زمانی که خواسته سر برسه. تو همین حین خط دوم میاد و با خیالت راحت اجرا میشه. زمانی که تموم شد خط اول هم اجرا میشه و اینجا قصهی ما هم به سر میرسه.
یه مثالم واسه این بزنیم باهم؟
console.log("Hello");
setTimeOut(function(){
console.log("I need Time");
}, 2000);
console.log("What's up?);
خوب همون جوری که انتظار داریم خط اول باید وارد Stack بشه و اجرا بشه. بعد از اینکه از Stack خارج شد خط دوم وارد میشه. اما صبر کن!!!!. این یه تابع است که زمان میخواد اونم ۲ ثانیه!!!!!!.
پس خط دوم داستان ما باید بره تو بگراند و کارش که تموم شده بیاد. خط سوم اجرا میشه اگر هنوز دو ثانیه تموم نشده بود برنامه صبر میکنه و تابع خط دوم رو اجرا میکنه.
من تا اینجا کلی حرف زدم که ممکنه حوصلهت سر رفته باشه.
اما قبل از اینکه برم سه تا سوال رو اینجا مینویسم حتما برو سراغش تا کاملتر یاد بگیری!
همیشه در حال یادگیری باش و یادت باشه زندگی هم گاهی سینگل ترده. باید صبر کنی زمان انجام یه چیزی سر بیاد تا بتونی یه چیز جدید رو وارد زندگیت کنی.