تفاوت بین Sync و Async در برنامه نویسی

حتما برای شما هم زیاد اتفاق افتاده که در طول روز چندین کار مختلف رو هم‌زمان با هم‌دیگه انجام دادید تا کارها سریع‌تر انجام بشن و زودتر به اون نتیجه‌ی دلخواهتون برسین . حالا تصور کنید اگر کار x رو فقط میتونستید قبل یا بعد از کار y انجام بدین (نه همزمان) اون موقع چی می‌شد ؟در مدل برنامه نویسی sync در هر لحظه از زمان تنها و تنها یک عملیات انجام میشه ... یعنی چی ؟ اجرای این مدل کدها از خط اول شروع میشه و به ترتیب ، یک‌به‌یکِ خط‌های برنامه اجرا میشه . اگر در حین اجرا، برنامه به یک تابع برسه اجرای برنامه متوقف میشه تا اون تابع اجرا بشه، اجرای اون تابع از خط اول شروع میشه و تا زمانی که خط‌به‌خط اون تابع اجرا نشه و نتیجه رو برنگردونه هیچ بخش دیگه‌ای از برنامه اجرا نمیشه:1.console.log( ' now I ' ); 2.console.log( ' know the ' ); 3.console.log( ' synchronous code ' ) ----OUTPUT---- //now I //know the //synchronous codeدر مدل برنامه نویسی async در هر لحظه از زمان میتونه چندین عملیات انجام بشه. فرض کنید شما یک تابع نوشتین... در حین اینکه اون تابع داره اجرا میشه بخش‌های دیگه‌ای از برنامه هم در حال اجرا شدن هستن، بعد از این که تابع اجرا شد و نتیجه رو برگردوند از اون نتیجه، توی بخش‌های دیگه‌ی برنامه در صورت لزوم استفاده میشه. الان یه مثال ساده میزنم تا بهتر متوجه بشین.فرض کنین شما میرین رستوران و مثلا پیتزا سفارش میدین =)) ... در حین اینکه پیتزای شما داره آماده میشه گارسون میره سر میز‌های دیگه و سفارش بقیه‌ی افراد رو میگیره. به این نوع عملکرد میگن async .حالا فرض کنین گارسون سفارش شما رو میگیره و تا وقتی که پیتزایی که شما سفارش دادین رو به دستتون نرسونه سراغ بقیه ی مشتری‌ها نمیره، این میشه sync.به زبون برنامه نویسی خودمون پیتزا رو ریکوئست در نظر بگیرین، آشپزخونه‌ی رستوران رو سرور و مشتری‌هارو کلاینت. گارسون هم میشه راه ارتباطی بین کلاینت و سرور (API). حالا شما فرض کنین کد ما sync باشه... واقعا چی میشه ؟فکر کنم با این مثال اهمیت برنامه‌نویسی async دیگه مشخص شد!برگردیم به همون محیط برنامه‌نویسی خودمون...توی یکسری از زبان‌های برنامه‌نویسی قابلیت‌هایی وجود دارن که بتونی کد رو به صورت async بنویسی. مثلا توی جاوااسکریپت promise , ( setTimeout , setInterval ...) callback functions و async await چیزهایی هستن که به شما کمک میکنن این کار رو انجام بدی (در حالی که خود جاوا اسکریپت در حالت کلی synchronous هست ). یک مثال جاوا اسکریپتی ببینم :1.setTimeout( ( ) => console.log ('I am a programmer') , 3000 ) // رو چاپ کن I am programmer این فانکشن میگه بعد از سه ثانیه 2.console.log('hello world') //hello world این دستور فقط میگه چاپ کن -----OUTPUT----- //hello world //I am a programmerهمونطور که دیدین در عین اینکه اون تابع داره اجرا میشه و منتظره که سه ثانیه بگذره تا اون جمله رو چاپ بکنه دستور بعدی اجرا میشه.در یک محیط synchronous، جایی که ریکوئست فانکشن‌ها زمانی برمیگردنن که به طور کامل اجرا شده باشن ، بهترین راه برای اجرای این تسک‌ها اینه که ریکوئست‌ها رو با توجه به اولویت یکی بعد از دیگری بنویسین. یعنی ریکوئست دوم دقیقا زمانی اجراش شروع میشه که ریکوئست اول به طور کامل اجرا شده باشه. زمانی کلی اجرای این فانکشن‌ها میشه مجموع زمان اجرای تک‌تک این فانکشن‌ها .اما در مورد محیط‌های asychronous بهتره این مثال رو ببینیم :1.setTimeout( ( ) => console.log( 'fadela' ), 5000 ); 2.setTimeout( ( ) => console.log( 'hello' ) , 3000 ); ----result---- //hello (بعد از ۳ ثانیه) //fadela ( hello بعد از ۵ ثانیه , یعنی ۲ ثاینه بعد از چاپ )یعنی کل مدت زمانی که طول می‌کشه این کد اجرا بشه برابر با ۵ ثانیه هستش. پیشنهادی که دارم اینه که با توجه به زبون برنامه‌نویسی که کار می کنین سعی کنین توی این مطلب بیشتر عمیق بشین که یکی از مهم ترین موارد تمیز کد زدن مربوط به همین موضوع هست.امیدوارم مطالب مفید واقع شده باشه. از همراهی و حمایتتون ممنونم.