برنامه‌نویسی

Synchronous و Asynchronous چیست؟


۲۲ تیر ۱۳۹۹
Synchronous و Asynchronous چیست؟

اجرا عملیات به صورت Synchronous:

Synchronous به معنی متصل و یا وابسته به هم است. وقتی شما عملیاتی را به صورت Synchronous اجرا می‌کنید، منتظر می‌مانید تا این عملیات تمام شود سپس می‌توانید عملیات دیگری را انجام دهید.

به عبارت دیگر، Synchronous به این معنی است که اجرا عملیات‌ها در یک دنباله اتفاق می‌افتد. مثال:

A -> B -> C -> D

در این مثال ابتدا عملیات A آغاز می‌شود و بعد از پایان آن B. به همین طریق بعد از پایان عملیات B، عملیات C آغاز می‌شود و به همین شیوه تا انتها پیش می‌رود. اجرا عملیات به صورت Synchronous به نقطه آغاز و پایان ۲ و یا تعداد بیشتری عملیات اشاره می‌کند و نه اجرای آن‌ها. در این مثال نقطه پایان عملیات A با نقطه آغاز عملیات B همزمان است:

SYNCHRONOUS
  |--------A--------|
                    |--------B--------|

وقتی عملیات به صورت Synchronous اجرا می‌شود، شما منتظر می‌مانید تا اجرای یک عملیات تمام شود تا بتوانید عملیات دیگری را آغاز کنید. اجرای یک عملیات به اتمام عملیات قبلی وابسته است.

مثال زیر اجرای عملیات‌ها به صورت Synchronous و در یک thread است:

1 thread ->   |<---A---->||<----B---------->||<------C----->|

مثال دیگری از اجرای عملیات ها به صورت Synchronous اما توسط چندین thread است:

thread A -> |<---A---->|  
                       \ 
thread B ------------>   ->|<----B---------->|  
                                             \ 
thread C ---------------------------------->   ->|<------C----->| 

اجرا عملیات به صورت Asynchronous:

زمانی که شما عملیاتی را به صورت Asynchronous اجرا می‌کنید، می‌توانید عملیات دیگری را اجرا کنید قبل از اینکه اجرا عملیات قبلی تمام شود. در پردازش و یا اجرا عملیات‌ها به صورت Asynchronous، نقطه آغاز و پایان اجرای عملیات‌ها با هم همزمان نیست:

ASYNCHRONOUS
  |--------A--------|
        |--------B--------|

در مثال بالا اجرای عملیات A با اجرای عملیات B هم‌پوشانی دارد. در واقع این دو عملیات با هم و یا در کنار هم و همزمان اجرا می‌شوند. وقتی عملیاتی به صورت Asynchronous اجرا می‌شود شما می‌توانید عملیات دیگری را اجرا کنید بدون اینکه لازم باشد تا اجرا عملیات قبلی به پایان برسد. به عبارت دیگر عملیات‌ها به یکدیگر وابسته و یا متصل نیستند.

در دنیای برنامه‌نویسی عملیات‌ها و یا task ها بر روی thread اجرا می‌شوند. مهم است تا بفهمیم می‌توان چندین thread ایجاد کرد تا از انباشته شدن عملیات‌ها در یک صف جلوگیری کرد.

همانطور که گفته شد مفهوم Synchronous و Asynchronous با thread ها چندان کاری ندارد و دلیلش هم این است که اجرای یک عملیات به صورت Asynchronous بر روی یک thread بسیار نادر و  کم است (گرچه از نظر فنی امکان پذیر است).

اجرای عملیات به صورت Asynchronous بر روی یک thread:

اجرای عملیات به صورت Asynchronous

اجرای عملیات به صورت Asynchronous بر روی چندین thread:

thread A ->     |<---A---->|
thread B ----->     |<----B---------->|
thread C --------->     |<------C--------->|

نقطه آغاز و پایان اجرای عملیات‌ها با > و < نشان داده شده است.

به بیان ساده‌تر:

Synchronous:

شما در یک صف قرار دارید تا یک بلیط برای یک فیلم را بخرید. شما به هیچ وجه نمی‌توانید یک بلیط تهیه کنید مگر اینکه تمام افرادی که در صف جلوی شما قرار دارند بلیط خود را تهیه کنند تا نوبت به شما برسد. این مثال برای تمام افرادی که پشت شما در صف قرار دارند نیز صادق است.

Asynchronous:

شما در یک رستوران هستید در حالی که مشتریان دیگری نیز در آنجا هستند تا همانند شما غذا میل کنند. حالا غذای خود را به مهماندار رستوران سفارش می‌دهید. در حالی که سایرین هم می‌توانند غذای خودشان را سفارش دهند. اما آن‌ها مجبور نیستند منتظر بمانند که سفارش شما پخت و سرو شود تا بتوانند سفارش خودشان را ثبت کنند. در آشپزخانه رستوران به صورت مداوم در حال پخت و سرو و دریافت سفارش‌های جدید هستند. مشتریان به محض اینکه سفارش‌شان پخته شود، آن را تحویل می‌گیرند.

اشتباه متداول:

وقتی شما به لغتنامه نگاه کنید شاید گیج شوید و این سوال را از خودتان بپرسید چیزی که باعث سردرگمی من می‌شود این است که:

“چگونه ممکن است Synchronous به معنی همزمان باشد در حالی که در اینجا به معنی انجام عملیات‌ها یکی پس از دیگری است و نه به صورت همزمان. همچنین Asynchronous به معنی غیر همزمان است در حالی که در اینجا عملیات‌ها در کنار هم و همزمان انجام می‌شوند؟”
شاید عجیب باشد اما Synchronous یعنی استفاده از یک clock cpu یکسان و زمانی که ۲ دستورالعمل و یا عملیات به صورت Synchronous هستند، آن‌ها از یک clock cpu یکسان استفاده می‌کنند و پشت سر هم و یکی پس از دیگری اجرا می‌شوند. Asynchronous یعنی عدم استفاده از یک clock یکسان و دستورالعمل‌ها به یکدیگر متصل نیستند. در واقع مفهوم Synchronous و Asynchronous به رابطه دستورالعمل‌ها و یا عملیات‌ها به یکدیگر اشاره نمی‌کند بلکه به رابطه آن‌ها با clock cpu اشاره می‌کند.

منبع: https://medium.com/from-the-scratch/wtf-is-synchronous-and-asynchronous-1a75afd039df