গ্লোবাল ইন্টারপ্রেটার লক (জিআইএল) উদাহরণ সহ পাইথনে মাল্টিথ্রেডিং

পাইথন প্রোগ্রামিং ভাষা আপনাকে মাল্টিপ্রসেসিং বা মাল্টিথ্রেডিং ব্যবহার করতে দেয় এই টিউটোরিয়ালে আপনি শিখবেন কিভাবে পাইথনে মাল্টিথ্রেডেড অ্যাপ্লিকেশন লিখতে হয়।

থ্রেড কি?

থ্রেড হচ্ছে সমকালীন প্রোগ্রামিং -এ এক্সেকশনের একক। মাল্টিথ্রেডিং একটি কৌশল যা একটি সিপিইউকে একই সময়ে একটি প্রক্রিয়ার অনেক কাজ সম্পাদন করতে দেয়। এই থ্রেডগুলি তাদের প্রক্রিয়া সম্পদ ভাগ করার সময় পৃথকভাবে সম্পাদন করতে পারে।

একটি প্রক্রিয়া কি?

একটি প্রক্রিয়া মূলত কার্যকর করার প্রোগ্রাম। যখন আপনি আপনার কম্পিউটারে একটি অ্যাপ্লিকেশন শুরু করেন (যেমন একটি ব্রাউজার বা টেক্সট এডিটর), অপারেটিং সিস্টেম একটি তৈরি করে প্রক্রিয়া

পাইথনে মাল্টিথ্রেডিং কি?

পাইথনে মাল্টিথ্রেডিং প্রোগ্রামিং একটি সুপরিচিত কৌশল যেখানে একটি প্রক্রিয়ার একাধিক থ্রেড তাদের ডাটা স্পেসকে মূল থ্রেডের সাথে ভাগ করে নেয় যা থ্রেডের মধ্যে তথ্য আদান-প্রদান এবং যোগাযোগকে সহজ এবং দক্ষ করে তোলে। থ্রেড প্রসেসের চেয়ে হালকা। মাল্টি থ্রেড তাদের প্রক্রিয়া সম্পদ ভাগ করার সময় পৃথকভাবে চালানো হতে পারে। মাল্টিথ্রেডিং এর উদ্দেশ্য হল একই সাথে একাধিক কাজ এবং ফাংশন সেল চালানো।

মাল্টিপ্রসেসিং কি?

মাল্টিপ্রসেসিং আপনাকে একসাথে একাধিক অসম্পূর্ণ প্রক্রিয়া চালানোর অনুমতি দেয়। এই প্রক্রিয়াগুলি তাদের সম্পদ ভাগ করে না এবং আইপিসির মাধ্যমে যোগাযোগ করে না।

পাইথন মাল্টিথ্রেডিং বনাম মাল্টিপ্রসেসিং

প্রসেস এবং থ্রেড বোঝার জন্য, এই দৃশ্যটি বিবেচনা করুন: আপনার কম্পিউটারে একটি .exe ফাইল একটি প্রোগ্রাম। যখন আপনি এটি খুলবেন, ওএস এটি মেমরিতে লোড করবে এবং সিপিইউ এটি চালাবে। যে প্রোগ্রামটি এখন চলছে তার উদাহরণকে বলা হয় প্রক্রিয়া।

প্রতিটি প্রক্রিয়ার 2 টি মৌলিক উপাদান থাকবে:

  • কোড
  • তথ্যটি

এখন, একটি প্রক্রিয়া নামক এক বা একাধিক উপ-অংশ ধারণ করতে পারে থ্রেড এই ওএস আর্কিটেকচারের উপর নির্ভর করে।

অন্য কথায়, এটি নির্দেশের একটি ধারা যা ওএস দ্বারা স্বাধীনভাবে চালানো যেতে পারে। একক প্রক্রিয়ার মধ্যে থ্রেডগুলি সেই প্রক্রিয়াটির ডেটা ভাগ করে এবং সমান্তরালতার সুবিধার জন্য একসঙ্গে কাজ করার জন্য ডিজাইন করা হয়েছে।

এই টিউটোরিয়ালে আপনি শিখবেন,

মাল্টিথ্রেডিং কেন ব্যবহার করবেন?

মাল্টিথ্রেডিং আপনাকে একটি অ্যাপ্লিকেশনকে একাধিক সাব-টাস্কের মধ্যে বিভক্ত করতে এবং এই কাজগুলি একই সাথে চালানোর অনুমতি দেয়। আপনি যদি সঠিকভাবে মাল্টিথ্রেডিং ব্যবহার করেন, আপনার অ্যাপ্লিকেশনের গতি, কর্মক্ষমতা এবং রেন্ডারিং সবই উন্নত করা যেতে পারে।

পাইথন মাল্টিথ্রেডিং

পাইথন মাল্টিপ্রসেসিং এবং মাল্টিথ্রেডিং উভয়ের জন্য নির্মাণ সমর্থন করে। এই টিউটোরিয়ালে, আপনি প্রাথমিকভাবে বাস্তবায়নের দিকে মনোনিবেশ করবেন বহুবিধ পাইথন সহ অ্যাপ্লিকেশন। দুটি প্রধান মডিউল রয়েছে যা পাইথনে থ্রেডগুলি পরিচালনা করতে ব্যবহার করা যেতে পারে:

  1. দ্য থ্রেড মডিউল, এবং
  2. দ্য থ্রেডিং মডিউল

যাইহোক, পাইথনে, গ্লোবাল ইন্টারপ্রেটার লক (জিআইএল) নামেও কিছু আছে। এটি বেশি পারফরম্যান্স লাভের অনুমতি দেয় না এবং এমনকি হতে পারে কমানো কিছু মাল্টিথ্রেডেড অ্যাপ্লিকেশনগুলির পারফরম্যান্স। আপনি এই টিউটোরিয়ালের আসন্ন বিভাগগুলিতে এটি সম্পর্কে সব শিখবেন।

থ্রেড এবং থ্রেডিং মডিউল

এই টিউটোরিয়ালে আপনি যে দুটি মডিউল সম্পর্কে জানতে পারবেন তা হল থ্রেড মডিউল এবং থ্রেডিং মডিউল

যাইহোক, থ্রেড মডিউলটি দীর্ঘদিন ধরে বাতিল করা হয়েছে। পাইথন 3 দিয়ে শুরু করে, এটি অপ্রচলিত হিসাবে মনোনীত করা হয়েছে এবং শুধুমাত্র হিসাবে অ্যাক্সেসযোগ্য __ থ্রেড পিছনের সামঞ্জস্যের জন্য।

আপনার উচ্চ স্তরের ব্যবহার করা উচিত থ্রেডিং অ্যাপ্লিকেশনগুলির জন্য মডিউল যা আপনি স্থাপন করতে চান। থ্রেড মডিউল শুধুমাত্র শিক্ষাগত উদ্দেশ্যে এখানে আচ্ছাদিত করা হয়েছে।

থ্রেড মডিউল

এই মডিউল ব্যবহার করে একটি নতুন থ্রেড তৈরির সিনট্যাক্স নিম্নরূপ: | _+_ |

ঠিক আছে, এখন আপনি কোডিং শুরু করার জন্য মৌলিক তত্ত্বটি অন্তর্ভুক্ত করেছেন। সুতরাং, আপনার আইডিএল বা একটি নোটপ্যাড খুলুন এবং নিম্নলিখিতটি টাইপ করুন: | _+_ |

ফাইলটি সংরক্ষণ করুন এবং প্রোগ্রাম চালানোর জন্য F5 চাপুন। যদি সবকিছু সঠিকভাবে সম্পন্ন করা হয়, এই আউটপুট যে আপনি দেখতে হবে:

আপনি জাতি শর্ত এবং কিভাবে সেগুলি সামনের বিভাগগুলিতে পরিচালনা করবেন সে সম্পর্কে আরও জানতে পারবেন

কোড ব্যাখ্যা

  1. এই বিবৃতিগুলি সময় এবং থ্রেড মডিউল আমদানি করে যা পাইথন থ্রেডগুলির এক্সিকিউশন এবং বিলম্ব পরিচালনা করতে ব্যবহৃত হয়।
  2. এখানে, আপনি একটি ফাংশন যাকে সংজ্ঞায়িত করেছেন থ্রেড টেস্ট, যা দ্বারা ডাকা হবে start_new_thread পদ্ধতি ফাংশনটি চারটি পুনরাবৃত্তির জন্য একটি লুপ চালায় এবং থ্রেডের নামটি মুদ্রণ করে যা এটিকে বলে। একবার পুনরাবৃত্তি সম্পন্ন হলে, এটি একটি বার্তা প্রিন্ট করে যে থ্রেডটি কার্যকর করা শেষ করেছে।
  3. এটি আপনার প্রোগ্রামের প্রধান বিভাগ। এখানে, আপনি কেবল কল করুন start_new_thread সঙ্গে পদ্ধতি থ্রেড টেস্ট একটি যুক্তি হিসাবে কাজ।

    এটি যুক্তি হিসাবে আপনি যে ফাংশনটি পাস করেছেন তার জন্য একটি নতুন থ্রেড তৈরি করবে এবং এটি কার্যকর করা শুরু করবে। মনে রাখবেন যে আপনি এটি প্রতিস্থাপন করতে পারেন (থ্রেড _ পরীক্ষা) অন্য কোন ফাংশন যা আপনি একটি থ্রেড হিসাবে চালাতে চান।

থ্রেডিং মডিউল

এই মডিউলটি পাইথনে থ্রেডিংয়ের উচ্চ স্তরের বাস্তবায়ন এবং মাল্টিথ্রেডেড অ্যাপ্লিকেশন পরিচালনার জন্য ডি ফ্যাক্টো স্ট্যান্ডার্ড। থ্রেড মডিউলের তুলনায় এটি একটি বিস্তৃত বৈশিষ্ট্য সরবরাহ করে।

থ্রেডিং মডিউলের গঠন



এই মডিউলে সংজ্ঞায়িত কিছু দরকারী ফাংশনগুলির একটি তালিকা এখানে দেওয়া হল:

ফাংশন নাম বর্ণনা
সক্রিয় গণনা () এর গণনা প্রদান করে থ্রেড যেসব বস্তু এখনো জীবিত
currentThread () থ্রেড ক্লাসের বর্তমান বস্তু প্রদান করে।
গোনা () সমস্ত সক্রিয় থ্রেড বস্তুর তালিকা।
ডেমন () থ্রেড একটি ডেমন হলে সত্য ফেরত দেয়।
জীবিত() থ্রেডটি এখনও বেঁচে থাকলে সত্য ফিরে আসে।
থ্রেড ক্লাস পদ্ধতি
শুরু () একটি থ্রেডের কার্যকলাপ শুরু করে। এটি প্রতিটি থ্রেডের জন্য শুধুমাত্র একবার কল করা উচিত কারণ এটি একাধিকবার কল করা হলে রানটাইম ত্রুটি ফেলে দেবে।
চালান () এই পদ্ধতিটি একটি থ্রেডের ক্রিয়াকলাপকে নির্দেশ করে এবং থ্রেড ক্লাসকে প্রসারিত করে এমন একটি শ্রেণী দ্বারা ওভাররাইড করা যেতে পারে।
যোগদান () এটি অন্য কোডের কার্য সম্পাদনকে অবরুদ্ধ করে যতক্ষণ না যে থ্রেডে join () পদ্ধতি বলা হয়েছিল তা বন্ধ হয়ে যায়।

ব্যাকস্টোরি: থ্রেড ক্লাস

আপনি থ্রেডিং মডিউল ব্যবহার করে মাল্টিথ্রেডেড প্রোগ্রাম কোডিং শুরু করার আগে, থ্রেড ক্লাস সম্পর্কে বোঝা অত্যন্ত গুরুত্বপূর্ণ থ্রেড ক্লাস হল প্রাথমিক শ্রেণী যা টেমপ্লেট এবং পাইথনে একটি থ্রেডের ক্রিয়াকলাপ নির্ধারণ করে।

একটি মাল্টিথ্রেডেড পাইথন অ্যাপ্লিকেশন তৈরি করার সবচেয়ে সাধারণ উপায় হল একটি ক্লাস ঘোষণা করা যা থ্রেড ক্লাস প্রসারিত করে এবং এটি রান () পদ্ধতিটি ওভাররাইড করে।

থ্রেড ক্লাস, সংক্ষেপে, একটি কোড ক্রমকে নির্দেশ করে যা একটি পৃথকভাবে চলে থ্রেড নিয়ন্ত্রণের।

সুতরাং, একটি মাল্টিথ্রেডেড অ্যাপ্লিকেশন লেখার সময়, আপনি নিম্নলিখিতগুলি করবেন:

  1. একটি ক্লাস সংজ্ঞায়িত করুন যা থ্রেড ক্লাস প্রসারিত করে
  2. ওভাররাইড করুন __এটা__ নির্মাতা
  3. ওভাররাইড করুন চালান () পদ্ধতি

একবার একটি থ্রেড বস্তু তৈরি করা হলে, শুরু () পদ্ধতিটি এই কার্যকলাপের বাস্তবায়ন শুরু করতে ব্যবহার করা যেতে পারে এবং যোগদান () বর্তমান কার্যকলাপ শেষ না হওয়া পর্যন্ত অন্য সব কোড ব্লক করার জন্য পদ্ধতি ব্যবহার করা যেতে পারে।

এখন, আপনার আগের উদাহরণ বাস্তবায়নের জন্য থ্রেডিং মডিউল ব্যবহার করার চেষ্টা করি। আবার, আপনার আইডিএলটি জ্বালান এবং নিম্নলিখিতটি টাইপ করুন: | _+_ |

আপনি উপরের কোডটি চালানোর সময় এটি আউটপুট হবে:

কোড ব্যাখ্যা

  1. এই অংশটি আমাদের আগের উদাহরণের মতই। এখানে, আপনি সময় এবং থ্রেড মডিউল আমদানি করেন যা পাইথন থ্রেডগুলির এক্সিকিউশন এবং বিলম্ব পরিচালনা করতে ব্যবহৃত হয়।
  2. এই বিটে, আপনি থ্রেডেস্টার নামে একটি ক্লাস তৈরি করছেন, যা উত্তরাধিকারসূত্রে বা প্রসারিত হয় থ্রেড থ্রেডিং মডিউলের ক্লাস। এটি পাইথনে থ্রেড তৈরির অন্যতম সাধারণ উপায়। যাইহোক, আপনি শুধুমাত্র কনস্ট্রাক্টর এবং ওভাররাইড করা উচিত চালান () আপনার অ্যাপে পদ্ধতি। আপনি উপরের কোড নমুনায় দেখতে পারেন, __এটা__ পদ্ধতি (নির্মাতা) ওভাররাইড করা হয়েছে।

    একইভাবে, আপনি ওভাররাইড করেছেন চালান () পদ্ধতি এটিতে এমন কোড রয়েছে যা আপনি একটি থ্রেডের মধ্যে চালাতে চান। এই উদাহরণে, আপনি thread_test () ফাংশনকে ডেকেছেন।

  3. এটি হল thread_test () পদ্ধতি যা এর মান নেয় আমি একটি যুক্তি হিসাবে, প্রতিটি পুনরাবৃত্তিতে এটি 1 দ্বারা হ্রাস করে এবং বাকি কোডের মাধ্যমে লুপ করে যতক্ষণ না আমি 0 হয়ে যাই। প্রতিটি পুনরাবৃত্তিতে, এটি বর্তমানে সম্পাদিত থ্রেডের নাম মুদ্রণ করে এবং অপেক্ষা সেকেন্ডের জন্য ঘুমায় (যা একটি যুক্তি হিসাবেও নেওয়া হয়)।
  4. থ্রেড 1 = থ্রেডস্টার (1, 'প্রথম থ্রেড', 1)

    এখানে, আমরা একটি থ্রেড তৈরি করছি এবং __init__ এ ঘোষিত তিনটি প্যারামিটার পাস করছি। প্রথম প্যারামিটার হল থ্রেডের আইডি, দ্বিতীয় প্যারামিটার হল থ্রেডের নাম, এবং তৃতীয় প্যারামিটার হল কাউন্টার, যা নির্ধারণ করে যে কতবার সময় লুপ চালানো উচিত।

  5. থ্রেড 2. স্টার্ট ()

    একটি থ্রেডের এক্সিকিউশন শুরু করার জন্য স্টার্ট পদ্ধতি ব্যবহার করা হয়। অভ্যন্তরীণভাবে, start () ফাংশনটি আপনার ক্লাসের run () পদ্ধতিতে কল করে।

  6. thread3.join ()

    Join () মেথড অন্যান্য কোডের এক্সিকিউশন ব্লক করে এবং থ্রেডটি শেষ না হওয়া পর্যন্ত অপেক্ষা করে।

যেমনটি আপনি ইতিমধ্যে জানেন, একই প্রক্রিয়ায় থাকা থ্রেডগুলি সেই প্রক্রিয়াটির মেমরি এবং ডেটাতে অ্যাক্সেস পায়। ফলস্বরূপ, যদি একাধিক থ্রেড একসাথে ডেটা পরিবর্তন বা অ্যাক্সেস করার চেষ্টা করে, ত্রুটিগুলি প্রবেশ করতে পারে।

পরবর্তী বিভাগে, আপনি বিভিন্ন ধরণের জটিলতা দেখতে পাবেন যা বিদ্যমান অ্যাক্সেস লেনদেনের জন্য যাচাই না করেই থ্রেডে প্রবেশের ডেটা এবং সমালোচনামূলক বিভাগে প্রদর্শিত হতে পারে।

ডেডলক এবং রেস কন্ডিশন

ডেডলক এবং রেস কন্ডিশন সম্পর্কে জানার আগে, সমসাময়িক প্রোগ্রামিং সম্পর্কিত কয়েকটি মৌলিক সংজ্ঞা বুঝতে সহায়ক হবে:

  • জটিল অংশ

    এটি কোডের একটি অংশ যা ভাগ করা ভেরিয়েবল অ্যাক্সেস বা পরিবর্তন করে এবং এটি একটি পারমাণবিক লেনদেন হিসাবে সম্পাদন করা আবশ্যক।

  • প্রসঙ্গ সুইচ

    এটি এমন একটি প্রক্রিয়া যা একটি সিপিইউ একটি ট্রেড থেকে অন্য টাস্কের পরিবর্তনের আগে একটি থ্রেডের অবস্থা সংরক্ষণ করে যাতে পরবর্তীতে একই পয়েন্ট থেকে আবার শুরু করা যায়।

ডেডলক

ডেথলকগুলি সবচেয়ে ভয়ঙ্কর সমস্যা যা ডেভেলপাররা পাইথনে একযোগে/মাল্টিথ্রেডেড অ্যাপ্লিকেশন লেখার সময় সম্মুখীন হয়। ডেডলকগুলি বোঝার সর্বোত্তম উপায় হল ক্লাসিক কম্পিউটার সায়েন্স উদাহরণ সমস্যা যা ব্যবহার করা হয় ডাইনিং দার্শনিকদের সমস্যা।

ডাইনিং দার্শনিকদের জন্য সমস্যা বিবৃতি নিম্নরূপ:

পাঁচটি দার্শনিক একটি গোল টেবিলে বসানো আছে পাঁচটি প্লেট স্প্যাগেটি (এক ধরনের পাস্তা) এবং পাঁচটি কাঁটা, যেমনটি চিত্রটিতে দেখানো হয়েছে।

ডাইনিং দার্শনিকদের সমস্যা

যে কোন সময়ে, একজন দার্শনিককে অবশ্যই খেতে হবে অথবা ভাবতে হবে।

তাছাড়া, একজন দার্শনিককে স্প্যাগেটি খাওয়ার আগে অবশ্যই তার সংলগ্ন দুটি কাঁটা (অর্থাৎ বাম ও ডান কাঁটা) নিতে হবে। অচলাবস্থার সমস্যা দেখা দেয় যখন পাঁচজন দার্শনিক একই সাথে তাদের ডান কাঁটা তুলে নেয়।

যেহেতু প্রত্যেক দার্শনিকের একটি করে কাঁটা আছে, তাই তারা সবাই অন্যদের জন্য তাদের কাঁটা নামানোর জন্য অপেক্ষা করবে। ফলে তাদের কেউ স্প্যাগেটি খেতে পারবে না।

একইভাবে, একটি সমবয়সী সিস্টেমে, একটি অচলাবস্থা ঘটে যখন বিভিন্ন থ্রেড বা প্রক্রিয়া (দার্শনিক) একই সময়ে ভাগ করা সিস্টেম সম্পদ (কাঁটা) অর্জন করার চেষ্টা করে। ফলস্বরূপ, কোনও প্রক্রিয়াই কার্যকর করার সুযোগ পায় না কারণ তারা অন্য কোনও প্রক্রিয়া দ্বারা পরিচালিত অন্য সংস্থার জন্য অপেক্ষা করছে।

রেস কন্ডিশন

একটি রেস কন্ডিশন একটি প্রোগ্রামের একটি অবাঞ্ছিত অবস্থা যা ঘটে যখন একটি সিস্টেম একসাথে দুই বা ততোধিক অপারেশন করে। উদাহরণস্বরূপ, লুপের জন্য এই সহজটি বিবেচনা করুন: | _+_ |

তৈরি করলে n এই কোডটি একবারে চালানো থ্রেডের সংখ্যা, যখন প্রোগ্রামটি কার্যকর করা শেষ হয় তখন আপনি i (যা থ্রেড দ্বারা ভাগ করা হয়) এর মান নির্ধারণ করতে পারবেন না। এর কারণ হল একটি বাস্তব মাল্টিথ্রেডিং পরিবেশে, থ্রেডগুলি ওভারল্যাপ হতে পারে, এবং i এর মান যা একটি থ্রেড দ্বারা পুনরুদ্ধার এবং সংশোধন করা হয়েছিল যখন অন্য কিছু থ্রেড এটি অ্যাক্সেস করতে পারে তার মধ্যে পরিবর্তন হতে পারে।

এই দুটি প্রধান শ্রেণীর সমস্যা যা একটি মাল্টিথ্রেডেড বা বিতরণকৃত পাইথন অ্যাপ্লিকেশনে হতে পারে। পরবর্তী বিভাগে, আপনি শিখবেন কিভাবে থ্রেড সিঙ্ক্রোনাইজ করে এই সমস্যা কাটিয়ে উঠতে হয়।

থ্রেড সিঙ্ক্রোনাইজ করা

জাতি পরিস্থিতি, অচলাবস্থা, এবং অন্যান্য থ্রেড-ভিত্তিক সমস্যা মোকাবেলা করার জন্য, থ্রেডিং মডিউল প্রদান করে তালা বস্তু ধারণা হল যে যখন একটি থ্রেড একটি নির্দিষ্ট সম্পদে অ্যাক্সেস চায়, তখন সে সেই সম্পদের জন্য একটি লক অর্জন করে। একবার একটি থ্রেড একটি নির্দিষ্ট সম্পদ লক করে, লকটি মুক্তি না হওয়া পর্যন্ত অন্য কোন থ্রেড এটি অ্যাক্সেস করতে পারে না। ফলস্বরূপ, সম্পদে পরিবর্তনগুলি পারমাণবিক হবে, এবং জাতিগত পরিস্থিতি এড়ানো হবে।

একটি লক একটি নিম্ন স্তরের সিঙ্ক্রোনাইজেশন আদিম দ্বারা প্রয়োগ করা হয় __ থ্রেড মডিউল যে কোন সময়ে, একটি লক 2 টি রাজ্যের মধ্যে হতে পারে: লক করা অথবা আনলক এটি দুটি পদ্ধতি সমর্থন করে:

  1. অর্জন ()

    যখন লক-স্টেট আনলক করা হয়, তখন আহরণ () পদ্ধতিতে কল করলে রাজ্যটি লক হয়ে যাবে এবং ফিরে আসবে। যাইহোক, যদি রাজ্যটি লক করা থাকে, তবে রিলিজ () পদ্ধতিটি অন্য কিছু থ্রেড দ্বারা না বলা পর্যন্ত অধিগ্রহণের কলটি অবরুদ্ধ থাকে।

  2. মুক্তি()

    রিলিজ () পদ্ধতিটি রাষ্ট্রকে আনলক করার জন্য ব্যবহার করা হয়, অর্থাৎ, একটি লক মুক্ত করার জন্য। এটা যে কোন থ্রেড দ্বারা বলা যেতে পারে, অগত্যা যে লক অর্জন করেছে।

আপনার অ্যাপে লক ব্যবহারের উদাহরণ এখানে। আপনার আইডিএলটি জ্বালান এবং নিম্নলিখিতটি টাইপ করুন: | _+_ |

এখন, F5 টিপুন। আপনি এই মত একটি আউটপুট দেখতে হবে:

কোড ব্যাখ্যা

  1. এখানে, আপনি কেবল কল করে একটি নতুন লক তৈরি করছেন থ্রেডিং লক () কারখানা ফাংশন। অভ্যন্তরীণভাবে, লক () প্ল্যাটফর্ম দ্বারা পরিচালিত সবচেয়ে কার্যকর কংক্রিট লক শ্রেণীর একটি উদাহরণ প্রদান করে।
  2. প্রথম বিবৃতিতে, আপনি acquire () পদ্ধতিতে কল করে লক অর্জন করেন। যখন তালা মঞ্জুর করা হয়েছে, আপনি মুদ্রণ করুন 'লক অর্জিত' কনসোলে। একবার আপনি থ্রেড চালাতে চান এমন সমস্ত কোড এক্সিকিউশন শেষ হয়ে গেলে, আপনি রিলিজ () পদ্ধতিতে কল করে লকটি ছেড়ে দেন।

তত্ত্বটি ঠিক আছে, তবে আপনি কীভাবে জানেন যে লকটি সত্যিই কাজ করেছে? আপনি যদি আউটপুটটি দেখেন, আপনি দেখতে পাবেন যে প্রতিটি মুদ্রণ বিবৃতি একটি সময়ে ঠিক একটি লাইন মুদ্রণ করছে। মনে রাখবেন যে, একটি পূর্ববর্তী উদাহরণে, প্রিন্ট থেকে আউটপুট যেখানে অস্পষ্ট কারণ একাধিক থ্রেড একই সময়ে print () পদ্ধতি অ্যাক্সেস করছিল। এখানে, প্রিন্ট ফাংশনটি লক অর্জনের পরেই বলা হয়। সুতরাং, আউটপুট একটি সময়ে এবং লাইন দ্বারা লাইন প্রদর্শিত হয়।

তালা ছাড়াও, পাইথন থ্রেড সিঙ্ক্রোনাইজেশন পরিচালনা করার জন্য কিছু অন্যান্য প্রক্রিয়াকে সমর্থন করে যা নীচে তালিকাভুক্ত করা হয়েছে:

  1. RLocks
  2. সেমাফোরস
  3. শর্তাবলী
  4. ঘটনা, এবং
  5. বাধা

গ্লোবাল ইন্টারপ্রেটার লক (এবং কিভাবে এটি মোকাবেলা করতে হবে)

পাইথনের জিআইএল সম্পর্কে বিস্তারিত জানার আগে, আসুন কয়েকটি পদ সংজ্ঞায়িত করি যা আসন্ন বিভাগটি বুঝতে সহায়ক হবে:

  1. CPU- আবদ্ধ কোড: এটি কোডের যেকোনো অংশকে বোঝায় যা সরাসরি CPU দ্বারা কার্যকর করা হবে।
  2. I/O- আবদ্ধ কোড: এটি যে কোন কোড হতে পারে যা OS এর মাধ্যমে ফাইল সিস্টেম অ্যাক্সেস করে
  3. সিপিথন: এটি রেফারেন্স বাস্তবায়ন পাইথনের এবং সি এবং পাইথনে (প্রোগ্রামিং ভাষা) লিখিত দোভাষী হিসাবে বর্ণনা করা যেতে পারে।

পাইথনে GIL কি?

গ্লোবাল ইন্টারপ্রেটার লক (জিআইএল) পাইথনে একটি প্রসেস লক বা মিউটেক্স ব্যবহার করা হয় যখন প্রসেসগুলি নিয়ে কাজ করা হয়। এটি নিশ্চিত করে যে একটি থ্রেড একটি সময়ে একটি নির্দিষ্ট সম্পদ অ্যাক্সেস করতে পারে এবং এটি একই সাথে বস্তু এবং বাইটকোডগুলির ব্যবহারকে বাধা দেয়। এটি পারফরম্যান্স বৃদ্ধিতে একক-থ্রেডেড প্রোগ্রামগুলিকে উপকৃত করে। পাইথনে জিআইএল খুবই সহজ এবং বাস্তবায়ন করা সহজ।

একটি নির্দিষ্ট সময়ে শুধুমাত্র একটি থ্রেডের একটি নির্দিষ্ট সম্পদে অ্যাক্সেস আছে তা নিশ্চিত করার জন্য একটি লক ব্যবহার করা যেতে পারে।

পাইথনের একটি বৈশিষ্ট্য হল এটি প্রতিটি দোভাষী প্রক্রিয়ায় একটি গ্লোবাল লক ব্যবহার করে, যার মানে হল যে প্রতিটি প্রক্রিয়া পাইথন দোভাষীকে নিজেই একটি সম্পদ হিসেবে বিবেচনা করে।

উদাহরণস্বরূপ, ধরুন আপনি একটি পাইথন প্রোগ্রাম লিখেছেন যা CPU এবং 'I/O' অপারেশন দুটি করতে দুটি থ্রেড ব্যবহার করে। যখন আপনি এই প্রোগ্রামটি চালান, তখন এটি ঘটে:

  1. পাইথন দোভাষী একটি নতুন প্রক্রিয়া তৈরি করে এবং থ্রেডগুলি তৈরি করে
  2. যখন থ্রেড -1 চলতে শুরু করে, এটি প্রথমে জিআইএল অর্জন করবে এবং এটি লক করবে।
  3. যদি থ্রেড -২ এখনই এক্সিকিউট করতে চায়, তাহলে অন্য প্রসেসর ফ্রি থাকলেও জিআইএল রিলিজের জন্য অপেক্ষা করতে হবে।
  4. এখন, ধরুন থ্রেড -1 একটি I/O অপারেশনের জন্য অপেক্ষা করছে। এই সময়ে, এটি জিআইএল প্রকাশ করবে, এবং থ্রেড -২ এটি অর্জন করবে।
  5. I/O অপস শেষ করার পর, যদি থ্রেড -১ এখন এক্সিকিউট করতে চায়, তাহলে আবার থ্রেড -২ দ্বারা জিআইএল রিলিজের জন্য অপেক্ষা করতে হবে।

এই কারণে, শুধুমাত্র একটি থ্রেড যে কোন সময়ে দোভাষী অ্যাক্সেস করতে পারে, যার মানে একটি নির্দিষ্ট সময়ে পাইথন কোড চালানোর জন্য শুধুমাত্র একটি থ্রেড থাকবে।

এটি একটি একক কোর প্রসেসরে ঠিক আছে কারণ এটি থ্রেডগুলি পরিচালনা করতে সময় স্লাইসিং (এই টিউটোরিয়ালের প্রথম বিভাগটি দেখুন) ব্যবহার করবে। যাইহোক, মাল্টি-কোর প্রসেসরের ক্ষেত্রে, একাধিক থ্রেডে সঞ্চালিত একটি CPU- আবদ্ধ ফাংশন প্রোগ্রামের দক্ষতার উপর যথেষ্ট প্রভাব ফেলবে কারণ এটি আসলে একই সময়ে সমস্ত উপলব্ধ কোর ব্যবহার করবে না।

জিআইএল কেন প্রয়োজন ছিল?

CPython আবর্জনা সংগ্রাহক একটি দক্ষ মেমরি ব্যবস্থাপনা কৌশল ব্যবহার করে যা রেফারেন্স কাউন্টিং নামে পরিচিত। এটি কীভাবে কাজ করে তা এখানে: পাইথনের প্রতিটি বস্তুর একটি রেফারেন্স গণনা রয়েছে, যা যখন এটি একটি নতুন পরিবর্তনশীল নাম বরাদ্দ করা হয় বা একটি পাত্রে যুক্ত করা হয় (যেমন টিপল, তালিকা ইত্যাদি)। অনুরূপভাবে, রেফারেন্সের সংখ্যা হ্রাস পায় যখন রেফারেন্স সুযোগের বাইরে চলে যায় বা যখন ডেল স্টেটমেন্ট বলা হয়। যখন কোনো বস্তুর রেফারেন্স কাউন্ট 0 এ পৌঁছায়, তখন তা আবর্জনা সংগ্রহ করা হয় এবং বরাদ্দকৃত মেমরি মুক্ত হয়।

কিন্তু সমস্যা হল যে রেফারেন্স কাউন্ট ভেরিয়েবল অন্য যেকোনো গ্লোবাল ভেরিয়েবলের মত জাতি অবস্থার প্রবণ। এই সমস্যা সমাধানের জন্য, পাইথনের বিকাশকারীরা গ্লোবাল ইন্টারপ্রেটার লক ব্যবহার করার সিদ্ধান্ত নিয়েছে। অন্য বিকল্পটি ছিল প্রতিটি বস্তুর একটি লক যুক্ত করা যার ফলে ডেডলক হয়ে যেত এবং অর্জন () এবং রিলিজ () কল থেকে ওভারহেড বৃদ্ধি পায়।

অতএব, জিআইএল ভারী সিপিইউ-আবদ্ধ অপারেশনগুলি চালানোর জন্য মাল্টিথ্রেডেড পাইথন প্রোগ্রামগুলির জন্য একটি উল্লেখযোগ্য সীমাবদ্ধতা (কার্যকরভাবে তাদের একক-থ্রেডযুক্ত করে তোলে)। আপনি যদি আপনার অ্যাপ্লিকেশনে একাধিক CPU কোর ব্যবহার করতে চান, তাহলে মাল্টিপ্রসেসিং পরিবর্তে মডিউল।

সারসংক্ষেপ

  • পাইথন মাল্টিথ্রেডিংয়ের জন্য 2 টি মডিউল সমর্থন করে:
    1. __ থ্রেড মডিউল: এটি থ্রেডিংয়ের জন্য একটি নিম্ন স্তরের বাস্তবায়ন প্রদান করে এবং অপ্রচলিত।
    2. থ্রেডিং মডিউল : এটি মাল্টিথ্রেডিংয়ের জন্য একটি উচ্চ স্তরের বাস্তবায়ন প্রদান করে এবং বর্তমান মান।
  • থ্রেডিং মডিউল ব্যবহার করে একটি থ্রেড তৈরি করতে, আপনাকে নিম্নলিখিতগুলি করতে হবে:
    1. একটি বর্গ তৈরি করুন যা প্রসারিত করে থ্রেড শ্রেণী
    2. এর কনস্ট্রাক্টর (__init__) ওভাররাইড করুন।
    3. এর ওভাররাইড চালান () পদ্ধতি
    4. এই শ্রেণীর একটি বস্তু তৈরি করুন।
  • থ্রেডটি কল করে কার্যকর করা যেতে পারে শুরু () পদ্ধতি
  • দ্য যোগদান () পদ্ধতিটি অন্যান্য থ্রেড ব্লক করার জন্য ব্যবহার করা যেতে পারে যতক্ষণ না এই থ্রেডটি (যেটিতে যোগদান করা হয়েছিল) কার্যকর করা শেষ করে।
  • একটি রেস কন্ডিশন ঘটে যখন একাধিক থ্রেড একই সময়ে একটি ভাগ করা সম্পদ অ্যাক্সেস বা সংশোধন করে।
  • থ্রেড সিঙ্ক্রোনাইজ করে এটি এড়ানো যায়।
  • পাইথন থ্রেড সিঙ্ক্রোনাইজ করার 6 টি উপায় সমর্থন করে:
    1. তালা
    2. RLocks
    3. সেমাফোরস
    4. শর্তাবলী
    5. ঘটনা, এবং
    6. বাধা
  • লকগুলি কেবল একটি নির্দিষ্ট থ্রেডের অনুমতি দেয় যা লকটি সমালোচনামূলক বিভাগে প্রবেশ করতে পারে।
  • একটি লকের দুটি প্রাথমিক পদ্ধতি রয়েছে:
    1. অর্জন () : এটি লক অবস্থা সেট করে লক করা যদি কোন লক করা বস্তুর উপর ডাকা হয়, তাহলে সম্পদ মুক্ত না হওয়া পর্যন্ত এটি ব্লক করে।
    2. মুক্তি() : এটি লক অবস্থা সেট করে আনলক এবং ফিরে আসে। যদি একটি আনলক করা বস্তুর উপর ডাকা হয়, এটি মিথ্যা প্রদান করে।
  • গ্লোবাল ইন্টারপ্রেটার লক হচ্ছে একটি মেকানিজম যার মাধ্যমে একবারে মাত্র 1 সিপিথন ইন্টারপ্রেটার প্রসেস এক্সিকিউট করা যায়।
  • এটি সিপিথনের আবর্জনা সংগ্রাহকের রেফারেন্স কাউন্টিং কার্যকারিতা সহজ করার জন্য ব্যবহৃত হয়েছিল।
  • ভারী সিপিইউ-আবদ্ধ অপারেশন সহ পাইথন অ্যাপস তৈরি করতে, আপনার মাল্টিপ্রসেসিং মডিউল ব্যবহার করা উচিত।