برنامه نویسی طی این سالها پیشرفت زیادی داشته و هر روز شاهد معرفی زبانها یا تکنولوژیهای جدید هستیم. هر ابزار جدید که معرفی میشود به دنبال حل یک مساله بوده و سعی دارد شرایط فعلی را بهتر کند. در واقع زبان ها، فریم ورکها و تمام ابزارهای برنامه نویسی که امروز از آنها استفاده میکنیم، حاصل تلاش انسانهای زیادی در طول سالهای مختلف بوده است. امروز سراغ مفهومی به نام Asynchronous رفته و چالش هایی که این مدل سعی در حل آن دارد را با هم مرور میکنیم. بعد از مطالعه این مطلب میفهمید که روش Asynchronous چیست ، چه تفاوتی با Synchronous داشته و چه کاربردهایی دارد. همراه ما باشید.
برای درک مفهوم برنامه نویسی غیرهمزمان بهتر است اول برنامه نویسی همگام یا Synchronous را بشناسیم. در این روش کدهای برنامه نویس پشت سر هم و به صورت خطی اجرا میشوند. یعنی اگر برنامه ما 400 خط کد داشته باشد، دستورات و توابع از خط 1 و به نوبت اجرا میشوند تا زمانی که به خط 400 برسیم و اجرای برنامه تمام شود. در این روش از برنامه نویسی دستورات باید به ترتیب اجرا شوند و تا زمانی که تابع "الف" اجرا نشده نمیتوان سراغ تابع "ب" رفت.
گفتن چند نکته به شما کمک میکند بیشتر با این نوع از برنامه نویسی آشنا شوید. اولین مورد درباره ترجمه کلمه Synchronous به فارسی بوده که کمی گمراه کننده است. با جستجو در چند دیکشنری معتبر به چنین نتایجی میرسیم: Synchronous: هم زمان، همگاه، واقع شونده بطور هم زمان. میبینید که تمام این کلمات اشاره به مفهومی به نام "زمان" دارند. ولی در این روش همه چیز به زمان خلاصه نشده و لزوما نباید همه چیز را در در زمان خلاصه کنیم. بلکه منظور از Synchronous این است که کدها پشت سر هم اجرا میشوند که این مورد میتواند به موارد دیگری به جز زمان هم وابسته باشد. پس مراقب باشید ترجمه این کلمه شما را گمراه نکند.
نکته دیگر مربوط به خوب بودن یا بد بودن این روش است. نباید اینطور فکر کنیم که با روی کار آمدن Asynchronous دیگر فاتحه Synchronous خوانده شده و باید استفاده از آن را کنار بگذاریم. در کل نمیتوان به یک تکنولوژی برچسب خوب یا بد زد. باید ببینیم این تکنولوژی کجا کاربرد دارد و چه قابلیت هایی دارد. در روش Synchronous هم اوضاع به همین شکل بوده و اگر در جای درست استفاده شود نتایج شگفت انگیزی به دنبال خواهد داشت.
مثالهای زیادی برای برنامه نویسی همگام وجود دارند. در واقع بسیاری از برنامه نویسان آگاهانه یا ناآگاهانه در حال استفاده از این روش هستند. اما برای آشنایی بیشتر بهتر است چند سناریو را با هم بررسی کنیم. در یک مثال ساده تکه کدی به زبان Python مینویسیم که یک ورودی از کاربر گرفته و آن را در صفحه نمایش چاپ کند:
در مثال بالا همه چیز با یک قاعده مشخص و خطی انجام میشود. کاربر یک ورودی وارد کرده و برنامه آن ورودی را چاپ میکند. یک مثال دیگر میتواند وقفه در زمان دانلود یک فایل باشد. فرض کنید برنامه ما قرار است اطلاعاتی را دانلود کرده و بعد تغییراتی روی این دادهها اعمال کند.
متوجه ایراد کار شدید؟ در واقع تا زمانی که دانلود فایلها تمام نشده باشد برنامه نمیتواند تغییرات خودش را اعمال کند. اگر روشی وجود داشت که برنامه با دانلود بخشی از فایل آن را پردازش هم بکند چقدر در عملکرد برنامه تاثیر مثبتی داشت. یا هنگامی که برنامه در حال دانلود فایلها است بتوانیم توابع دیگر برنامه را اجرا کنیم. دقیقا به خاطر همین موارد و همین مزایا است که سراغ برنامه نویسی Asynchronous میرویم.
برنامه نویسی Asynchronous (ناهمگام یا نامتقارن) یک مدل و مفهوم در برنامه نویسی است. در این مدل برخلاف روش Synchronous کدهای ما پشت سر هم اجرا نمیشوند و به اصطلاح ترتیب کدها غیرخطی است. حالا دیگر اجباری نیست که برنامه 400 خطی ما به ترتیب از خط 1 تا 400 اجرا شود و این روال میتواند تغییر کند. یا مثالی که درباره دانلود و پردازش فایلها زدیم را هم میتوانیم به کمک Asynchronous بهتر پیاده سازی کنیم. به این شکل که تا فایلها در حال دانلود هستند، CPU را به بخشهای دیگر اختصاص بدهیم. پس در Asynchronous ترتیب اجرای دستورات پشت سر هم نیست. اما چه دلیلی دارد که ترتیب اجرای کدها را در برنامه به هم بریزیم؟
CPU عضو حیاتی و مغز متفکر کامپیوتر به حساب میآید. میتوان به راحتی از داشتن قطعاتی مثل کارت گرافیک، کارت صدای اکسترنال، خنک کنندهها یا دی وی دی رایتر چشم پوشی کرد اما بدون CPU کامپیوتر ما حتی روشن هم نمیشود. حالا به نظرتان چه دلیلی دارد که این عضو مهم را حتی برای یک لحظه هم بیکار بگذاریم؟ به کمک روش برنامه نویسی Asynchronous میتوانیم از منابع سخت افزاری نهایت استفاده را داشته باشیم.
Asynchronous میتواند بسیاری از مشکلات ما را حل کند. این روش از لحاظ ترتیب اجرا کاملا در نقطه مقابل Synchronous قرار دارد و ما در یک برنامه میتوانیم چندین جریان اجرایی یا Control Flow داشته باشیم. Asynchronous کمی شبیه به حل پازل است. همانطور که ما هنگام چیدن پازل از ترتیب خطی استفاده نکرده و با توجه به شرایط مختلف قطعات پازل را کنار هم میچینیم، در روش Asynchronous هم پردازشها با ترتیب مشخصی اجرا نمیشوند.
هیچ تضمینی وجود ندارد که استفاده از چند Control Flow و خارج کردن برنامه از حالت خطی و ترتیبی سرعت اجرای برنامه شما را افزایش دهد. در واقع این مدل اجرایی گاهی تاثیری در سرعت برنامه نداشته و حتی ممکن است در بعضی از موارد سرعت برنامه را کاهش هم بدهد. اگر به خاطر افزایش سرعت اجرا تصمیم گرفته اید از Asynchronous استفاده کنید باید یک تجدید نظر در تصمیم خود داشته باشید. اگر این تکنولوژی در جای مناسب به کار بگیرید میتواند نتایج بسیار خوبی به دنبال داشته باشد. در واقع هر بار که کد مینویسید باید از خودتان این سوال را بپرسید که استفاده از Asynchronous مفید خواهد بود یا خیر. مثلا میتوانید بپرسید بهتر است در این قسمت از برنامه وقتی در حال خواندن فایلی هستم باید در پشت صحنه یک پردازش هم اجرا کنم یا خیر. اگر جواب مثبت بود استفاده از Asynchronous میتواند کمک بزرگی به حساب بیاید.
?
Asynchronous به تنهایی یک مفهوم است. بهتر است زمانی که در حال بررسی تئوریک آن هستیم وارد مباحث برنامه نویسی نشویم. زمانی که به خوبی این مدل را درک کردیم میتوانیم هنگام کدنویسی از آن استفاده کنیم. زبانهای برنامه نویسی روشهای متنوعی برای پیاده کردن این مدل ارائه دادند که با توجه به زبانی که استفاده میکنیم ممکن است کمی متفاوت باشند. مثلا در زبان C# و بعد از تکنولوژی .NET Framework نسخه 4.5 به بعد دو کلیدواژه Async و Await معرفی شدند و کار پردازش نامتقارن دادهها را به عهده گرفتند. فراموش نکنید که عملیات Asynchronous محدود به دات نت فریم ورک و زبان برنامه نویسی سی شارپ نبوده و میتوان از آن در بخشهای مختلفی استفاده کرد.
در این مطلب بررسی کردیم که مفهوم Asynchronous چیست و چه کاربردهایی دارد. اول راجع به Synchronous صحبت کرده و گفتیم که در این روش برنامه ما به صورت خط به خط اجرا میشود. در مقابل به مدل Asynchronous رسیدیم که این ترتیب زمانی را به هم میریخت تا برنامه ما برای یک وقفه طولانی معطل نشده و پردازشهای دیگر را مدیریت کند. همینطور اشاره ای به کاربرد آن در تکنولوژی دات نت فریم ورک داشتیم. شاید در نگاه اول پردازشهای نامتقارن و ناهمگام جذاب به نظر برسند اما باید با توجه به شرایط برنامه خود تصمیمی بگیرید که از آن استفاده کنید یا خیر.