در بخش قبل با پارادایمهای Concurrent Programming و Sequential Programming آشنا شدیدیم و مزایا و معایب هر یک را بررسی کردیم. در این بخش میخواهیم انواع حالات برنامهنویسی در پارادایم Concurrent Programming را بررسی کنیم و تفاوتها و مزایا و معایت هر یک را درک کنیم.
واژهنامه
در این بخش از چند واژه تخصصی استفاده کرده ام که قبل از شروع لازم است به شرح هر یک بپردازم.
CPU bound task
تسکی که محاسبه آن بیشتر وابسته به عملیات ریاضی است که توسط CPU انجام میشود. مانند پردازش تصویر، پردازش متن، پردازش صدا، پردازشهای محاسباتی مربوط به ماشین لرنینگ و …
IO bound task
تسکی که محاسبه آن کمتر به محاسبات ریاضی وابسته است و بیشتر از نوع نوشتن و خواندن روی حافظه است. برخی از این نوع تسکها شامل خواندن و نوشتن در دیتابیس، کپی کردن، دانلود کردن، آپلود کردن فایل و … میشوند.
پردازشگر
CPU ها گاهی تک هستهای هستند و گاهی چند هستهای. در این بخش برای سهولت بیشتر، به صورت کلی به همه انواع آن پردازشگر میگوییم.
مقدمه
در پارادایم Concurrent Programming، برنامهها به دو دسته زیر تقسیم میشوند.
- Parallel – موازی
- Concurrent – همزمان یا همروند
برنامهنویسی در هر یک از این دو دسته، تکنیک خاص خود را میطلبد. برای برنامهنویسی موازی از تکنیک multiprocessing و برای برنامهنویسی همزمان (همروند) از تکنیکهای multithreading و asynchronous programming استفاده میشود.

تصویر بالا نشان میدهد که:
- برای Multiprocessing Programming از ماژول های
multiprocessingوconcurrent.futureمیتوان استفاده کرد. - برای Multithreaded Programming از ماژول های
threadingو_threadمیتوان استفاده کرد. - برای Asynchronous Programming از ماژول
asyncioمیتوان استفاده کرد.
در ادامه این دوره، این ماژول ها را به شما خواهم آموخت و در هر کدام عمیق خواهیم شد.
parallel چیست؟
در پایتون به معنی اجرا و انجام چند کار به صورت همزمان است.

تصویر بالا اجرای ۳ تسک به صورت همزمان را نشان میدهد. همانطور که مشخص است برای انجام هر کدام از آنها، هیچیک متوقف نمیشود.
برای اینکه بتوانید برنامه هایی بنویسید که تسک ها را با این روش انجام دهد باید از تکنیک multiprocessing استفاده کنید. همچنین در نسخه ۳.۱۳ پایتون، اجرای موازی تسک ها با استفاده از تکنیک multithreading نیز فراهم شده است که بعدا بیشتر به آن خواهیم پرداخت.
concurrent چیست؟
در پایتون به معنی اجرای چند تسک به صورت همزمان با ایجاد وقفه بین آنها است.

در تصویر بالا:
- ابتدا CPU تسک اول را اجرا میکند.
- پس از اینکه ۳۰٪ از تسک اول را اجرا کرد یک تسک مهمتر میرسد.
- وضعیت تسک اول در حافظه CPU ذخیره میشود.
- CPU تسک دوم را اجرا میکند.
- و…
در واقع در هر لحظه فقط یک تسک انجام میشود. در این لحظه سایر تسکها متوقف هستند.
در این نوع برنامهنویسی از تکنیک multithreading و asynchronous programming استفاده میشود.
تکنیک multiprocessing
تنها تکنیکی است که به ما امکان اجرای موازی برنامهها را روی چند پردازنده را میدهد. مناسب تسکهای CPU Bound است.
برای برنامهنویسی با این تکنیک میتوان از ماژول multiprocessing یا concurrent.fufures استفاده کرد.
موارد استفاده:
- محاسبات پیچیده و سنگین: مانند تحلیل دادههای بزرگ، پردازش تصویر و ویدیو، یا کارهای علمی و عددی.
- کارهای مستقل از یکدیگر: جایی که وظایف مختلف نیازی به اشتراکگذاری حافظه ندارند.
مثال – مامان مهربون
یک مامان مهربون در حالی که با یک دست مایع شیرینی را هم میزند، با دست دیگر میتواند فرزندش را در آغوش بگیرد و نیز همزمان با تلفن صحبت کند. در این مثال مامان به صورت موازی هر ۳ کار را انجام میدهد.
تکنیک multithreading
این تکنیک به ما امکان اجرای برنامه روی چندین thread را میدهد. برنامههایی که با این تکنیک نوشته میشوند به صورت همزمان (نه موازی!) اجرا میشوند.
این تکنیک مناسب تسکهایی است که به صورت معتدل، هم CPU Bound هستند و هم IO Bound
موارد استفاده:
- کارهای ورودی/خروجی: مانند خواندن/نوشتن فایل، عملیات شبکه، یا دسترسی به پایگاه داده.
- وظایف موازی که نیاز به اشتراکگذاری حافظه دارند: مانند بهروزرسانی رابط کاربری.
مثال – برگزاری مهمانی
فرض کنید دوستان خود را برای یک دورهمی به صرف شام برای فردا شب دعوت کردهاید. باید امروز سالاد، ژله و شام را درست کنید. بدین منظور، یک ظرف آب روی اجاقگاز قرار میدهید تا وقتی به جوش آمد از آن برای درست کردن ژله استفاده کنید. یک ظرف آب دیگر روی اجاقگاز قرار میدهید که وقتی به جوش آمد برای پخت غذا از آن استفاده کنید. در این حین کاهوها را نیز براش شستشو آماده میکنید.
در این مثال شما به صورت همزمان (نه موازی!) مشغول انجام چند کار هستید.
نکته مهم
پایتون از نسخه ۳.۱۳ امکانی فراهم کرده که میتوان با استفاده از multithreading برنامه های واقعا موازی نوشت اما به دلیل اینکه این امکان هنوز در حال گذراندن مراحل تست و بهبود است، این امکان به صورت پیشفرض در پایتون غیر فعال است. اما به هر حال توجه داشته باشید که با multithreading هم میتوان برنامه های موازی نوشت و هم برنامه های همروند (همزمان، نه موازی!). این بستگی به شما دارد که این امکان را در پایتون فعال کنید یا خیر. در ادامه این دوره بیشتر به این موضوع خواهم پرداخت.
تکنیک Asynchronous Programming
برنامههایی که با این تکنیک توسعه مییابند، تنها روی یک thread اجرا میشوند. به عبارت دیگر، برنامههای async همگی single-thread هستند. به همین دلیل اصلا برای انجام تسکهای CPU Bound مناسب نیستند.
موارد استفاده:
- عملیات ورودی/خروجی غیر مسدودکننده: مانند درخواستهای شبکه، عملیات فایلهای غیرهمزمان، و غیره.
- تعداد زیادی وظیفه که به صورت همزمان اجرا میشوند: مانند سرویسهای وب، رباتهای چت، یا برنامههای Real-Time.
مثال – رسیدگی به امور روزمره
فرض کنید شخصی از یک فروشگاه اینترنتی یک تلفن همراه میخرد. سپس بستهای را برای دوستش که در شهر دیگری است پست میکند. سپس چند گیاه در باغچه میکارد. او وضعیت سفارش و بستهای که پست کرده را هرزگاهی چک میکند. همچنین گاهی به گیاهانی که کاشته سر میزند تا ببیند جوانه زدهاند یا خیر.
در این مثال این شخص ۳ کار را به صورت همزمان شروع کرده است اما انجام این کارها آنقدر زمان میبرد که در این بین میتواند به کارهای دیگری مشغول شود.
خلاصه
| پارادایم | concurrent programming | concurrent programming | concurrent programming |
| نوع | parallel | concurrent | concurrent |
| تکنیک | multiprocessing | multithreading | asynchronous programming |
| نیاز به RAM و Network | کم | متوسط | زیاد |
| نیاز به CPU | زیاد | متوسط | کم |
| تعداد CPU | چند | یک | یک |
| تعداد Thread | چند | چند | یک |
| نحوه اجرای تسک | اجرای موازی چند تسک | اجرای همزمان چند تسک | اجرای همزمان تعداد زیادی از تسکهای سبک |
| ماژولها | concurrent.futuresmultiprocessing | cuncorrent.futuresmultithreading_thread | asyncio |