mahdijalali313

کانسپت های مختلف concurrency و تفاوت های آنها

mahdijalali313 ۱۳۹۷/۱۰/۲۷ مباحث عمومی برنامه‌نویسی

سلام خدمت تمامی دوستان برنامه نویس

می خواستم این 3 مفهوم را در کانکورنسی را برام توضیح بدید و تفاوت های آنها را توضیح دهید :

Multithreading

Parallel programming

Asynchronous programming 

پیشاپیش از شما بابت پاسخ تشکر می کنم

پاسخ‌ها به این تاپیک
محمد
محمد
۱۳۹۷/۱۰/۲۷

البته پاسخ دوستمون کامل بود اما شاید این دو مقاله هم کمک کنه

https://goo.gl/SQghLq

https://goo.gl/xoKp8C

امین ظاهردَنّاک
امین ظاهردَنّاکاندروید دولوپر، مترجم
۱۳۹۷/۱۰/۲۷

یسری تعاریف هست که با هم مشابهن و معمولاً با هم اشتباه گرفته میشن. من سعی میکنم یکی یکی تعریفشون کنم و یجاهایی هم با هم مقایسشون کنم تا مرز بینشون بهتر مشخص بشه.

Concurrency (همزمانی)

این مفهوم وقتی معنی پیدا میکنه که حداقل دو کار (task) واسه انجام دادن وجود داشته باشه. Concurrency وقتی تو برنامه اتفاق میفته، کاربر فکر میکنه که اون دوتا کار دارن همزمان با هم انجام میشن ولی در‌واقع اینطور نیست و داره یجورایی گول میخوره. حتماً میپرسی چطور؟ اینطور که وقتی concurrency اتفاق میفته، کارها به این شکل انجام میشن: اول یه بخشی از کار اول (مثلاً ۳۰٪) انجام میشه، بعد یه بخشی از کار دوم (مثلاً ۴۰٪) انجام میشه، بعد دوباره کار اول ۴۰٪ دیگه‌اش انجام میشه (مجموعاً ۷۰٪ از کار اول انجام شده تا الان) و بعد دوباره یه بخشی از کار دوم و همینطور تا دوتا کار بطور کامل (۱۰۰٪) انجام بشن. یکم بخوایم دقیق‌تر شیم، concurrency از یکی از امکانات سیستم‌عامل‌ها به اسم CPU time-slicing داره استفاده میکنه که یه بخشی از کار اول رو میده CPU کارهای محاسباتش رو انجام بده، اون بخش که تموم شد، حالا سیستم عامل به CPU میگه که یه بخش از کار دوم رو انجام بده و به همون شکلی که بالاتر گفتم داستان جلو میره تا همه کارها بطور کامل انجام بشن.


Parallelism (موازیسیون!)

اینجا نیازی نیست که حداقل دو کار (task) وجود داشته باشه. اینجا دیگه از شیادکاریهای concurrency خبری نیست و واقعاً کارها (یا بخشهایی از یک کار و یا بخش‌های مختلف کارهای مختلف) بطور موازی روی هسته‌های پردازشی جداگانه‌ی CPU انجام میشن.


- نکته‌ی مهم: وقتی صحبت از parallelism هست، الزاماً به CPU یی با بیش از یک هسته‌ی پردازشی نیاز هست. پس وقتی یک CPU یک هسته‌ای داریم، میشه concurrency داشت ولی از parallelism خبری نیست.

- نکته: میشه برنامه‌ای داشت که از parallelism استفاده کنه ولی از concurrency‌ استفاده نکنه و برعکس.

- نکته: میشه برنامه‌ای نوشت که از هیچکدوم استفاده نکنه و کارها رو به ترتیب و یکی یکی انجام بده.

- نکته: میشه برنامه‌ای نوشت که از هر دو استفاده کنه. چطور؟ اینطور که هم کارها و زیرکارها (sub-tasks یا همون بخش‌های کارهای مختلف) رو هسته‌های مختلف انجام بشن و هم CPU time-slicing اتفاق بیفته رو هسته‌های مختلف.

https://howtodoinjava.com/java/multi-threading/concurrency-vs-parallelism/

Asynchronous

یه فراخوانی asynchronous، الزاماً یه ترد جدید ایجاد نمیکنه. معنی asynchronous صرفاً اینه که تردی که فراخوانی رو انجام داده، منتظر پاسخ اون فراخوانی نمیمونه (یعنی اینجور نیست که کار دیگه ای نکنه تا اون فراخوانی به سرانجام برسه) . مثلاً توی برنامه نویسی اندروید، وقتی قراره چیزی از اینترنت دانلود شه، میشه از کلاسی به اسم AsyncTask استفاده کرد که وقتی یکی از متدهاش فراخوانی میشه، تو یه ترد جداگانه کارهای مربوط به دانلود انجام میشه. نکته مهم اینجاست که وقتی AsyncTask داره کارهاشو انجام میده، ترد اصلی برنامه که وظیفه اجرا و نمایش و و سایر کارهای متداول اپلیکیشن رو برعهده داره، اصطلاحاً block نمیشه و برنامه حین دانلود به روال عادی اجرای خودش میتونه ادامه بده و منتظر نمیمونه تا دانلود تموم بشه (روشهای مختلفی واسه پیاده‌سازی Asynchronous وجود داره یکیش ایجاد یه ترد جدید هست).

البته ظاهراً میشه با یدونه ترد هم asynchronous بودن (یا asynchrony) رو تجربه کرد به این شکل که concurrent (همزمان) (همونطوری که تو توضیحات concurrency بود) کار اصلی و کار (یا کارهای) ثانویه رو انجام بده.


https://stackoverflow.com/questions/600795/asynchronous-vs-multithreading-is-there-a-difference

https://codewala.net/2015/07/29/concurrency-vs-multi-threading-vs-asynchronous-programming-explained/

https://developer.android.com/reference/android/os/AsyncTask


multi-threading

این موضوع هم صرفاً برمیگرده به اینکه ما در آن واحد از چند (multiple) ترد (thread) استفاده کنیم (در نتیجه: multi-threading). اگه بخوایم یه مقایسه بکنیم با بحث asynchronous بودن، میشه گفت که asynchronous بودن یه بحثی راجب task هاست و multi-threading یه بحثی راجب تردها.

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