تفاوت بین Asynchronous و Multi-Threading

پیاده سازی Asynchronous به صورت Multi-Threaded

تفاوت بین Process و Thread چیست؟

تفاوت بین Task و Thread

برنامه نویسی Asynchronous چیست؟

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

تصویر زیر به خوبی نمایش میدهد که چطور دو فایل به روش های مختلف از شبکه واکشی و ترکیب می شود

در یک سیستم asynchronous .ابتدا thread اول فایل Request1 را به خود اختصاص میدهد و دومین thread فایل Request2 را تخصیص میدهد بدون اینکه منتظر پایان Request1 باشد و سپس هر دو رشته منتظر نتایج خود هستند تا به نتیجه برسند، که پس از آن دوباره برای ترکیب نتایج مجدداً Re-synchronize می شوند.

مثال دیگر با رویکرد single-thread برنامه ای است که یک فایل را از سیستم عامل درخواست می کند و نیاز به عملیاتی وابسته به ریاضیات دارد.

برنامه نویسی Multi-threading چیست؟

برنامه نویسی Multi-threading به اجرای concurrent / parallel بیش از یک مجموعه متوالی (thread) از دستورالعمل ها اشاره دارد.

در یک پردازنده تک هسته ، multi-threading توهم اجرای parallel را نشان می دهد.

در پردازنده های چند هسته ای، thread ‌ها واقعا parallel هستند. چندین کار موازی و همزمان اتفاق می‌افتند.

یک مثال ساده از عملیات multi-threading دانلود دو فایل از دو تب مختلف در مرورگر وب می باشد. در هر تب یک از یک thread جدید برای دریافت فایل درخواستی استفاده می شود. هیچ کدوم از تب ها منتظر پایان عملیات دیگری برای اجرای عملیات خودش نمیمونه بلکه به طور همزمان این عملیات رو انجام میدهند.


برنامه نویسی Asynchronous در مقابل Multi-threading

برنامه‌نویسی multi-threading تماما در مورد اجرای همزمان توابع مختلف است.

برنامه‌نویسی async درباره اجرای non-blocking بین توابع است. و همچنین ما می توانیم async رو به صورت single-threaded یا multi-threaded درخواست دهیم.

بنابراین ، multi-threading یک نوع برنامه نویسی asynchronous است.

بیایید مقایسه ساده‌ای داشته باشیم؛ شما یک دوست دارید، و شما تصمیم گرفتید با هم شام بخورید.

عملیات async زمانی است که شما به دوست خود می‌گویید: " شما به فروشگاه می‌روید و ماکارونی خریداری می‌کنید. وقتی برگشتی بهم خبر بده که با هم شام بخوریم. در همین حال، من سس و نوشیدنی را آماده می‌کنم."

عملیات Threadingمی‌گوید: " شما آب را بجوشانید. من سس گوجه‌فرنگی را گرم می‌کنم. در حالی که آب می‌جوشد، از من بخواهید و من ماکارونی را در داخل آن قرار میدهم. وقتی که سس گرم است، می‌توانید پنیر را اضافه کنید. وقتی هر دو این کار انجام شد من میشینم و شما شام را سرو می کنید. سپس با هم غذا می‌خوریم." در این حالت، می‌توانیم توالی را ببینیم، که نشان‌دهنده مجموعه ترتیبی دستورالعمل‌ها برای هر فرد (thread) می باشد.

حالا از کدوم استفاده کنیم؟

انتخاب بین دو مدل برنامه‌نویسی به طور عمده به performance بستگی دارد.

به طور خلاصه، برای کاربردهای در مقیاس بزرگ با بسیاری از عملیات I / O و محاسبات مختلف، با استفاده از جریان برنامه‌نویسی asynchronous multi-threading ، از منابع محاسباتی استفاده خواهد کرد و از توابع non-blocking مراقبت خواهد کرد. این مدل برنامه‌نویسی هر سیستم‌عامل است!

بنابراین اگر ما تصمیم گرفتیم که این مدل را اجرا کنیم، باید مراقب مسائل مختلفی مانند race condition, deadlocks, shared resources, and callbacks events باشیم

منبع: https://www.baeldung.com/cs/async-vs-multi-threading