خب همونجور که میدونید درمورد GIL یا همون Global Interpreter Lock بحث زیاده 🤯

مشکل ما با GIL چیه؟

اینه که نمیذاره مولتی‌تردینگ واقعی داشته باشیم.

یعنی چی؟

یعنی نمی‌تونیم چندتا تسک رو همزمان روی چندتا ترد اجرا کنیم.

چرا؟

چون GIL میگه:

«در هر لحظه فقط یه ترد حق داره اجرا بشه، بقیه باید وایسن نوبتشون بشه.»

حالا نکته بامزه اینجاست:

اگه بیای چندتا ترد ران کنی، این تردا میان سر GIL دعوا می‌کنن کلی context switching می‌خوره latency میره بالا یه عالمه overhead میاد رو برنامه.

نتیجه؟ مولتی‌تردینگ برای کارای CPU-bound نه تنها کمک نمی‌کنه، بدترم می‌کنه برای همین باید single-thread باشه 😅

(احتمالاً خودتونم وقتی async برای CPU-bound نوشتید دیدید چه وضعیه.)

حالا چرا اصلاً GIL وجود داره؟

سؤال خوبیه 👌

خیلی خلاصه بگم نذاشته پایتون به چوخ بره 😂

چطوری؟

میاد thread safety رو برات تضمین می‌کنه، نمیذاره race condition بیاد وسط و همه چی بترکه.

ولی خب GIL دردسرم کم درست نمیکنه:

نمیذاره مولتی‌تردینگ CPU-bound داشته باشیم.

بعدم بخوای حذفش کنی هزاران لایبری که با درنظر گرفتن gil نوشته شده باید اپدیت بشن :)

و....

کلاً محدودمون می‌کنه.

راه‌حل چیه؟

1. C Extension

یعنی توابع سنگینت رو تو C بنویسی، اونجا اجرا بشه، فقط از پایتون صدا بزنی. اینجوری GIL رو می‌تونی دور بزنی.

2. Multiprocessing

این یکی مطرح ترین راهه. به تعداد core های CPU پروسس بالا میاری. هر پروسس مفسر خودش و در نتیجه GIL خودش رو داره اینجا واقعاً موازی میشه.

ولی اینجا یه توهمه که «ایول مشکل حل شد»…

سخت در اشتباهید 😅

چرا؟

چون:

ـprocess خیلی سنگینه، هر کدوم کلی overhead دارن.

ارتباط بین processها (همون IPC) خودش یه هزینه‌ی جداست.

داده‌ها باید بین processها جابه‌جا بشن (queue، pipe، shared memory و …) که اینم کندی و مصرف حافظه میاره.

گزینه اپشنال شدن گیل هم توی ۳.۱۳ کامل گیل رو حذف نمیکنه میتونیم مولتی پراسسینگ و موازی سازی کنیم ولی خب خودشون هنوز تایید نکرده و ازمایشیه و کلی مشکلات داره.

گزینه هاییم هست مثل استفاده از nogil که خب یکسری مشکلات دارن که توی این پست جا نمیشن بگم

📌 خلاصه: GIL هم ناجیه، هم قاتل. ناجی چون امنیت میده، قاتل چون مولتی‌تردینگ CPU-bound رو ازمون میگیره. ولی خب این مورد توی I/O bound process نیست چون وقتی یه پراسس io ران میشه گیل خاموش میشه و میتونی parallel processing داشته باشی :)