اگر شما هم مثل خیلی از برنامهنویسها باشید، حتماً بارها با مفاهیم برنامهنویسی همزمان و موازی (Concurrency و Parallelism) برخورد کردهاید و شاید یک مقدار سردرگم شده باشید. خیلیها این دو رو با هم قاطی میکنند، اما در واقع دو مفهوم کاملاً متفاوت هستند که در این مقاله از کدیتی میخواهیم دربارهشون صحبت کنیم.
سرفصل های مقاله
برنامهنویسی همزمان (Concurrency) یعنی چی؟
بیایید با مفهوم Concurrency شروع کنیم. فرض کنید توی آشپزخونه هستید و چند کار رو همزمان انجام میدید، مثلاً در حال درست کردن چای، خرد کردن سبزیجات و پختن غذا هستید. شما شاید همزمان چندین کار رو شروع کنید، ولی لزوماً در هر لحظه فقط روی یکیشون تمرکز میکنید. این دقیقاً مثل برنامهنویسی همزمانه! یعنی برنامه داره چندین تسک (Task) رو همزمان مدیریت میکنه، اما در هر لحظه ممکنه فقط روی یکی از اونها اجرا بشه.
در Concurrency، چند تسک میتونن به صورت متناوب اجرا بشن، اما این به معنی اجرای همزمان اونا نیست. مثلاً در پایتون، با استفاده از Threading میتونید تسکهای همزمان بسازید، ولی چون پایتون از Global Interpreter Lock (GIL) استفاده میکنه، در هر لحظه فقط یک تسک واقعاً در حال اجراست.
برنامهنویسی موازی (Parallelism) یعنی چی؟
حالا بریم سراغ Parallelism. اینجا داستان فرق داره! فرض کنید شما و یک نفر دیگه تو آشپزخونه هستید و هر دو همزمان مشغول کارهای مختلف هستید. مثلاً شما چای درست میکنید و دوستتون هم داره سبزیجات رو خرد میکنه. توی برنامهنویسی، این یعنی تسکهای مختلف واقعاً به صورت همزمان روی چندین پردازنده اجرا میشن.
تو برنامههای موازی، تسکها میتونن دقیقاً در یک لحظه روی چندین هسته پردازنده انجام بشن. این مفهوم بیشتر توی زبانهایی مثل Go یا C++ با ابزارهایی مثل OpenMP یا MPI استفاده میشه، جایی که شما میتونید کدتون رو طوری بنویسید که واقعاً به صورت موازی روی پردازندههای چندگانه اجرا بشه.
کی باید از Concurrency استفاده کنیم و کی از Parallelism؟
اینکه از کد همزمانی (Concurrency) استفاده کنید یا موازی (Parallelism)، بستگی به نوع کاری داره که دارید انجام میدید. اگر برنامهتون چندین وظیفه مستقل داره که لزوماً نیازی به پردازش همزمان ندارند، Concurrency گزینه خوبیه. مثلاً توی اپلیکیشنهای وب، جایی که منتظرید دیتا از سرور برگرده، میتونید از همزمانی استفاده کنید تا اپلیکیشن قفل نشه.
اما اگه پروژهتون نیاز به پردازش سنگین داره و دوست دارید از تمام توان پردازنده استفاده کنید، بهتره از Parallelism استفاده کنید. مثلاً توی برنامههایی مثل تحلیل داده یا یادگیری ماشین، پردازشهای موازی میتونه کلی به بهینهتر شدن کد کمک کنه.
جمعبندی
خلاصه اینکه، Concurrency یعنی انجام چندین کار همزمان، ولی ممکنه هر لحظه فقط یکی از اونها واقعاً در حال اجرا باشه. Parallelism یعنی تسکهای مختلف واقعاً به صورت همزمان روی چندین هسته اجرا میشن. اینکه از کد همزمانی استفاده کنید یا موازی، کاملاً به نوع پروژه و نیازتون بستگی داره. اما هر دو ابزارهای قدرتمندی هستند که میتونن به بهبود عملکرد برنامهها کمک کنن.
امیدواریم تونسته باشیم مبحث برنامهنویسی همزمان و موازی رو براتون خوب توضیح داده باشیم