এই লেখায় পাইথন গ্লোবাল ইন্টারপ্রেটার লক (GIL) সম্পর্কে জানব। GIL হল একটি লক যা পাইথন ইন্টারপ্রেটারকে একসাথে একাধিক থ্রেড এক্সিকিউট করতে বাধা দেয়। এটি পাইথন ৩.x বা তার আগের সংস্করণে একটি পরিচিত লিমিটেশন কারণ এটি মাল্টি-থ্রেডেড আর্কিটেকচারে সত্যিকারের মাল্টিথ্রেডিং সক্ষম করে না।
GIL কেন Introduce করা হয়েছিল?
পাইথন অটোমেটিক গারবেজ কালেকশন সাপোর্ট করে। যখন একটি অবজেক্টের রেফারেন্স কাউন্ট শূন্যে যায়, তখন মেমরি মুক্ত হয়।
>>> import sys
>>> var = {}
>>> print(sys.getrefcount(var))
2
>>> v = var
>>> print(sys.getrefcount(v))
3
যদি রেফারেন্স কাউন্ট একসাথে কমে এবং বড়ে, তবে অটোমেটিক কলেক্টর সঠিকভাবে কাজ করতে পারে না এবং মেমরি লিকের সম্ভাবনা বড়ে। এই রিস্ক কমাতে GIL معرفی করা হয়েছিল। প্রতিটি ভেরিয়েবলের জন্য আলাদা লক ব্যবহার করলে ডেডলক হতে পারে, তাই একটি গ্লোবাল লক ভালো সমাধান মনে হয়েছিল।

GIL পাইথনে কেন এখনো আছে?
GIL সরিয়ে দেওয়া কঠিন কারণ পাইথন (CPython) C-তে লেখা এবং এর বেস সাথে গভীরভাবে জড়িত। GIL সরানোর চেয়ে এটি উন্নত করা সহজ। মাল্টি-থ্রেডেড CPU-বাউন্ড অপারেশনের জন্য GIL বাধা সৃষ্টি করে, কারণ একই সময়ে একটি CPU কোর ব্যবহার করতে পারে। তবে I/O-বাউন্ড অ্যাপ্লিকেশন (যেমন ওয়েব অ্যাপ, Django সার্ভার) এতে প্রায় সমস্যা হয় না।
এক উদাহরণ: প্রসেস P1-এ থ্রেড t1 এবং t2 আছে। t1 রান হয়ে GIL অর্জন করে → t1 I/O-এর জন্য অপেক্ষায় GIL রিলিজ করে → t2 GIL অর্জন করে রান শুরু করে (এই সময় t1-ও রেডি কিন্তু GIL t2-র কাছে)। এখানে GIL বাধায়।
পাইথন প্রোগ্রামার সাধারণত GIL অর্জন/রিলিজ নিয়ে চিন্তা করেন না, যতক্ষণ না C/C++ এক্সটেনশন লিখছেন।
উপসংহার
এই লেখায় পাইথন GIL, এর গুরুত্ব এবং কেন এটি সরাসরি রিমুভ করা যায় না তা আলোচনা করা হলো।