আপনি যদি কোনো Python বেসড রোলে ইন্টারভিউ দিতে যান, আর আপনাকে GIL নিয়ে প্রশ্ন করবেনা, এটা আমি…
GIL কী?
Python এর GIL (Global Interpreter Lock) হলো একটি বিশেষ লক, যা একসাথে একের বেশি থ্রেডকে Python কোড চালাতে বাধা দেয়। এক কথায়, এটি মাল্টি-থ্রেডিং অ্যাপ্লিকেশনগুলোকে ঠিক ভাবে কাজ করতে দেয় না। আপনার কোডে যতই মাল্টি-থ্রেডিং ফিচারস থাকুক না কেন, GIL থ্রেডগুলোকে একের পর এক লাইনে দাঁড় করিয়ে রাখে এবং প্রতিটা থ্রেডকে পালাক্রমে একসাথে কোড চালাতে বাধ্য করে। এই কারণে, আপনার প্রোগ্রামে যতই থ্রেড যুক্ত করেন না কেন, তারা আসলে parallel ভাবে একসাথে কাজ করতে পারে না, বরং sequentially কাজ করে।
GIL বর্তমান সময়ে থ্রেডিং এর জন্য বড় একটি বাধা মনে হলেও, আগের সময়ে, যখন কম্পিউটারের মেমোরি এবং প্রসেসিং ক্ষমতা কম ছিল, তখন GIL মেমরি এফিসিয়েন্ট ছিল। কারণ, সেই সময়ে কম্পিউটিং রিসোর্স সীমিত ছিল এবং মাল্টি-থ্রেডিং অ্যাপ্লিকেশনগুলোও তেমন জনপ্রিয় ছিল না। GIL এর সাহায্যে Python ইন্টারপ্রেটার মেমোরি ম্যানেজমেন্ট এবং কোড এক্সিকিউশনকে সহজ, কার্যকর ও সুরক্ষিতভাবে কাজ করতে পারত।
GIL এর উপস্থিতি Python এর প্রথম দিকের সংস্করণগুলোতে ভালো পারফরম্যান্স দিত এবং ডেভেলপারদের কাজ সহজ করত।
তাহলে GIL কেন এখনও python এ আছে?
GIL Python থেকে সরানো সহজ কাজ না, কারণ এটা ইন্টারপ্রেটারের ইন্টারনাল স্ট্রাকচারের সাথে অনেক গভীরভাবে জড়িত। GIL সরালে Python এর মেমোরি ম্যানেজমেন্ট, থ্রেড সিঙ্ক্রোনাইজেশন, আর reference counting পুরোপুরি রিডিজাইন করতে হবে।
তাছাড়া প্রতিটি থ্রেডের জন্য আলাদা লক রাখতে হবে, যার ফলে পারফরম্যান্স কমে যাতে পারে আর deadlock বা race condition এর সম্ভাবনাও বাড়বে। Single-threaded প্রোগ্রামগুলোর পারফরম্যান্সও খারাপ হয়ে যেতে পারে, আর Python এর আগের ভার্সনের সাথে কম্প্যাটিবিলিটি রক্ষা করাও কঠিন হবে। Python ডেভেলপাররা এবং কনট্রিবিউটররা অনেক দিন ধরেই GIL ছাড়া Python ইন্টারপ্রেটার ডিজাইন করার চেষ্টা করছে।
তাহলে Python এতো জনপ্রিয় কেন?
Python GIL এর সীমাবদ্ধতা থাকলেও, এটি মেশিন লার্নিং (ML), আর্টিফিশিয়াল ইন্টেলিজেন্স (AI), এবং ওয়েব ডেভেলপমেন্টের ক্ষেত্রে ব্যাপকভাবে ব্যবহৃত হচ্ছে।
মেশিন লার্নিং এবং AI তে GIL: মেশিন লার্নিং এবং ডেটা প্রসেসিং এর বেশিরভাগ কাজই I/O-bound, যেমন ডেটা লোডিং, প্রিপ্রোসেসিং, বা ফাইল থেকে ডেটা পড়া। এসব ক্ষেত্রে GIL এর প্রভাব কম থাকে, কারণ I/O-bound কাজ চলাকালীন অন্যান্য থ্রেডগুলো parallel ভাবে কাজ করতে পারে। Python এর multiprocessing মডিউল ব্যবহার করে একাধিক প্রসেস তৈরি করা সম্ভব, যেখানে প্রতিটি প্রসেস আলাদা GIL নিয়ে কাজ করে। ফলে, CPU-bound কাজগুলোও parallel ভাবে সম্পাদন করা যায়। TensorFlow এবং PyTorch এর মতো লাইব্রেরিগুলো এই মডিউল ব্যবহার করে GIL এর সীমাবদ্ধতা কাটিয়ে ওঠে। মেইনলি GPU তে মডেল ট্রেইনিং করা হয়, যা GIL এর সম্পূর্ণ বাইরে থেকে কাজ করে এবং CUDA, OpenCL এর মতো প্রযুক্তি ব্যবহার করে parallel execution সম্পন্ন করে। ফলে, Python শুধুমাত্র high-level API হিসেবে কাজ করে, আর কম্পিউটেশনের মূল কাজ GPU তে হয়।
ওয়েব ডেভেলপমেন্টে GIL: Python ভিত্তিক ওয়েব ফ্রেমওয়ার্ক যেমন Django ও Flask এর বেশিরভাগ কাজই I/O-bound। HTTP request/response হ্যান্ডলিং, ডাটাবেস থেকে ডেটা রিট্রিভ করা, caching ইত্যাদি কাজগুলো GIL দ্বারা তেমন প্রভাবিত হয় না। Django এবং Flask সাধারণত Gunicorn বা uWSGI এর মতো ওয়েব সার্ভার ব্যবহার করে, যা multiprocessing এবং multiple worker process তৈরি করতে পারে, ফলে parallel request handling করা সম্ভব হয়। এছাড়া, Django এবং Flask Redis caching এবং Celery এর মতো external service সাপোর্ট করে, যা background task management ও caching এর মাধ্যমে পারফরম্যান্স উন্নত করে। Django 3.1 থেকে async ও await এর সাপোর্ট যুক্ত হওয়ায় asynchronous operations আরও দ্রুত সম্পন্ন করা যায়।
Python এ GIL থাকার পরেও এটি এখন আর তেমন বড় সমস্যা হিসেবে দেখা হয় না, কারণ multiprocessing, asyncio, এবং Cython এর মতো টুলস ব্যবহার করে GIL এর সীমাবদ্ধতা এড়িয়ে parallel এবং concurrent execution করা সম্ভব। মেশিন লার্নিং, ডেটা সায়েন্স, এবং ওয়েব ডেভেলপমেন্টের ক্ষেত্রে GIL এর সীমাবদ্ধতা সফলভাবে manage করেই Python এখনো ডেভেলপারদের অন্যতম প্রিয় প্রোগ্রামিং ভাষা হিসেবে শীর্ষে রয়েছে। এর জনপ্রিয়তা প্রতিদিনই বাড়ছে।
আর সবচেয়ে বড় কথা “আঙ্গুর ফল টক!” আঙ্গুর খাইতে হলে এভাবেই খাওয়া লাগবে। কি আর করার।
References & More information:
Python Wiki
Mohammad Golam Dostogir,
Software Engineer at Cressive DX
Linkedin | Github | Stackoverflow