سلام؛
در این مقاله کوتاه میخواهیم تفاوت مفهوم فانکشن های synchronous و asynchronous را با مثالی ساده بررسی کنیم.
مسئله:
فرض کنیم یک اتوبان داریم که در این اتوبان یک پمپ بنزین و یک عوارضی را می خواهیم جانمایی کنیم. برای عوارضی حتما باید مطمئن شویم همه ماشین های از عوارضی عبور میکنند و پول پرداخت میکنند. و پمپ بنزین باید بگونه ای باشد که هر ماشینی که نیاز به بنزین دارد باید بتواند وارد به سادگی و بدون ایجاد مزاحمت برای دیگران وارد پمپ بنزین شده و از آن استفاده کند و بدون ایجاد مزاحمت برای دیگران وارد جاده اصلی شده و به مسیر قبلی خود ادامه دهد.
حالت Synchronous:
زمانی که عوارضی را جانمایی میکنیم همه ماشین ها مجبورند ترمز کنند تا یک عملیاتی انجام شود(در اینجا پرداخت پول است) سپس دوباره به حرکت ادامه می دهند تا سرعتشان را به سرعت قبلی برسانند.
حالت Asynchronous:
در صورتی که اگر بخواهیم یک پمپ بنزین را جانمایی کنیم هر خودرویی که نیاز به سوخت دارد از جاده اصلی جدا شده و وارد صف های پمپ بنزین میشود. مسلما تعداد صف ها بزرگتر مساوی یک می باشد. اصطلاحا به هر صف queue میگویند.
حال عملیات روی هر صف به وسیله یکی از همان دستگاه های پمپ بنزین انجام می گردد که اصطلاحا به آنها کارگر گفته میشود.
افرادی هم که در کنار پمپ بنزین می ایستند عملا ناظر بر این روند خواهند بود و اگر فرضا در هر صف دو یا چند پمپ بنزین داشته باشیم آن افراد میتوانند ماشین ها را به صورت دلخواه به یکی از پمپهای بنزین در آن صف هدایت و متصل کنند.
ماشین ها پس از پر شدن باک بنزین و تکمیل فرایند پرداخت و دیگر اتفاقات از صف خارج شده و به همان اتوبان قبلی بر می گردند. حتی در حالت های کمی پیچیده تر میتوان مسیر های ورود به اتوبان را متفاوت در نظر گرفت و از یک یا چند نقطه وارد اتوبان شوند که متناسب با نیاز پروژه تغییر میکند.
نکته مهمی که در طی این روند رخ میدهد این است که تمام اتومبیل های داخل اتوبان با همان سرعت قبلی خود به حرکت ادامه میدهند ولی آنهایی که به چیز دیگری نیاز دارند سرعت خود را تغییر می دهند.
بنابراین در این حالت همه راضی تر و سریعتر هستند. :))
یکی از سایت های خوبی که این مفاهیم را حرفه ای تر توضیح میدهد سایت RabbitMQ است. RabbitMQ یک message broker است. در این سایت به زبان های زیر توضیح داده است.
Python/Java/Ruby/PHP/C#/JavaScript/Go/Elixir/Objective-C/Swift/Spring AMQP
( این مقاله اولین پست من در ویرگول است. از کمی و کاستی های احتمال عذرخواهی میکنم و ممنون میشم با ارائه پیشنهاد و انتقاداتتون به بهتر شدن مقاله های بعدی کمک کنید)