সিপিথনে গ্লোবাল ইন্টারপ্রেটার লক (জিআইএল) কী?


244

একটি গ্লোবাল ইন্টারপ্রেটার লক কী এবং এটি কেন একটি সমস্যা?

পাইথন থেকে জিআইএল অপসারণ করার জন্য প্রচুর আওয়াজ উঠেছে এবং আমি কেন তা এত গুরুত্বপূর্ণ তা বুঝতে চাই। আমি নিজেই কোনও সংকলক বা কোনও অনুবাদক লিখিনি, তাই বিশদ নিয়ে সাঁকো নাও, আমার সম্ভবত তাদের বুঝতে হবে to


3
ডেভিড বেজলি আপনাকে জিআইএল সম্পর্কে জানতে চেয়েছিলেন এমন সমস্ত কিছু দেখুন
হুগডব্রাউন

1
পাইথনের জিআইএল এবং থ্রেডিংয়ের বিষয়ে কথা বলার একটি দীর্ঘ নিবন্ধ এখানে কিছুক্ষণ আগে লিখেছিলাম। এটি এতে মোটামুটি বিশদে চলে যায়: jessenoller.com/2009/02/01/…
jnoller

এখানে জিআইএল-এর কয়েকটি কোড প্রদর্শন করছে: github.com/cankav/python_gil_demonstration
Kavaklıoğlu

3
আমি এটি জিআইএল এর সেরা ব্যাখ্যা। দয়া করে পড়ুন. dabeaz.com/python/Unders
فہ

realpython.com/python-gil আমি এই দরকারীটি পেয়েছি
qwr

উত্তর:


220

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

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


46
ভাল উত্তর - মূলত এর অর্থ হ'ল পাইথনের থ্রেডগুলি কেবল আই / ওকে ব্লক করার জন্য ভাল; আপনার অ্যাপ্লিকেশন প্রসেসরের ব্যবহারের 1 সিপিইউ কোরের উপরে কখনই যাবে না
আনা বেটস

8
"পাইথন বিকাশকারী হিসাবে আপনি সাধারণত সিআইএল জুড়ে আসেন না যতক্ষণ না আপনি সি এক্সটেনশান লেখেন" - আপনি হয়ত জানেন না যে আপনার মাল্টি-থ্রেড কোডটি শামুকের গতিতে চলার কারণ জিআইএল, তবে আপনি ' অবশ্যই এর প্রভাব অনুভব করব। এটি এখনও আমাকে অবাক করে দেয় যে পাইথনের সাথে একটি 32-কোর সার্ভারের সুবিধা গ্রহণ করার অর্থ আমার সমস্ত সম্পর্কিত ওভারহেড সহ 32 টি প্রক্রিয়া প্রয়োজন।
বেসিক

6
@ পলবেটস: এটি সত্য নয়। সম্ভবত কর্মক্ষমতা সমালোচনামূলক কোড ইতিমধ্যেই সি এক্সটেনশনের এবং Gil যেমন, মুক্তি করতে পারেন ব্যবহার করে regex, lxml, numpyমডিউল। সাইথন কাস্টম কোডে জিআইএল মুক্তি দিতে দেয় যেমন,b2a_bin(data)
জেফএস

5
@ পল বাজেস: মাল্টিপ্রসেসিং মডিউলটি ব্যবহার করে আপনি প্রসেসরের ব্যবহারের 1 সিপিইউ কোডের উপরে পেতে পারেন । একাধিক থ্রেড তৈরির চেয়ে একাধিক প্রক্রিয়া তৈরি করা "ভারী ওজন" but
এজে নিউফিল্ড

1
@ ডেভিড_এডলার হ্যাঁ, এখনও আছে, এবং সম্ভবত এটি কিছু সময়ের জন্য রয়ে যাবে। এটি পাইথনকে সত্যিই অনেকগুলি বিভিন্ন কাজের চাপের জন্য দরকারী হওয়া বন্ধ করে দেয় না।
বিনয় সাজিপ

59

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

এটি একটি বাস্তব বিশ্বের উপমাতে রাখার জন্য: কল্পনা করুন যে 100 জন বিকাশকারী একটি মাত্র কফি মগ দিয়ে কোনও সংস্থায় কাজ করছেন। বেশিরভাগ বিকাশকারী কোডিংয়ের পরিবর্তে কফির জন্য অপেক্ষা করতে সময় কাটাতেন।

এর কোনটি পাইথন-নির্দিষ্ট নয় - পাইথনকে প্রথমে জিআইএল-এর কী দরকার ছিল তার বিবরণ আমি জানি না। তবে, আশা করি এটি সাধারণ ধারণা সম্পর্কে আপনাকে আরও ভাল ধারণা দিয়েছে।


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


36

আসুন প্রথমে বুঝতে পারি পাইগন জিআইএল কী সরবরাহ করে:

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

এখন কেন এটি একটি সমস্যা:

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

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

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


4
দ্রষ্টব্য : পিপাইয়ের জিআইএল রয়েছেতথ্যসূত্র : http://doc.pypy.org/en/latest/faq.html#does-pypy-have-a-gil-why । যদিও আয়রনপাইথন এবং জাইথনের জিআইএল নেই।
তাসদিক রহমান

প্রকৃতপক্ষে, পাইপির একটি জিআইএল আছে, তবে আয়রন পাইথন নেই।
ইমানুয়েল

@ এমমানুয়েল পিপাই সরানোর জন্য উত্তরটি সম্পাদনা করেছে এবং এতে আয়রন পাইথন অন্তর্ভুক্ত রয়েছে।
অক্ষররাজ

17

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

https://www.youtube.com/watch?v=ph374fJqFPE

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

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

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


15

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

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

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

মনে রাখবেন যে আপনি উদাহরণস্বরূপ সি তে লিখিত কোনও পদ্ধতির অভ্যন্তরে জিআইএলকে মুক্তি দেওয়া সম্ভব।

জিআইএল-এর ব্যবহার পাইথনের সহজাত নয়, তবে এর বেশিরভাগ সিপিথন সহ তার দোভাষীর কাছে। (# সম্পাদিত, মন্তব্য দেখুন)

জিআইএল ইস্যুটি পাইথন 3000 এ এখনও বৈধ।


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

৩.২-এ নতুন জিআইএল সম্পর্কে কী বলা যায়?
new123456

কেবলমাত্র এটি যুক্ত করতে যে আপনার কোনও সমস্যা নেই / মুটেটেস / সেমোফোরেস প্রয়োজন যদি একটি মাত্র থ্রেড মেমরি আপডেট করে। @ new123456 এটি একক থ্রেডেড পারফরম্যান্সকে আঘাত না করে (যা নিজেই চিত্তাকর্ষক হয়) তাত্পর্যটি আরও কমিয়ে দেয় এবং থ্রেডগুলি আরও ভাল করে দেয় তবে এটি এখনও একটি বিশ্বব্যাপী লক।
বেসিক

14

পাইথন 3.7 ডকুমেন্টেশন

আমি পাইথন threadingডকুমেন্টেশন থেকে নিম্নলিখিত উদ্ধৃতি হাইলাইট করতে চাই :

সিপিথন বাস্তবায়নের বিশদ: সিপিথনে, গ্লোবাল ইন্টারপ্রেটার লকের কারণে, কেবলমাত্র একটি থ্রেড পাইথন কোড একবারে কার্যকর করতে পারে (যদিও কিছু নির্দিষ্ট কর্মক্ষমতা-ভিত্তিক গ্রন্থাগারগুলি এই সীমাবদ্ধতাটি অতিক্রম করতে পারে)। আপনি যদি নিজের অ্যাপ্লিকেশনটি মাল্টি-কোর মেশিনগুলির গণ্য সংস্থানগুলির আরও ভাল ব্যবহার করতে চান তবে আপনাকে multiprocessingবা ব্যবহার করার পরামর্শ দেওয়া হচ্ছে concurrent.futures.ProcessPoolExecutor। তবে আপনি যদি একসাথে একাধিক আই / ও-বাউন্ড কার্য চালাতে চান তবে থ্রেডিং এখনও উপযুক্ত মডেল।

গ্লসারি এন্ট্রিরglobal interpreter lock এই লিঙ্কগুলির জন্য এটি ব্যাখ্যা করে যে জিআইএল ইঙ্গিত দেয় যে পাইথনে থ্রেডযুক্ত সমান্তরালতা সিপিইউ বাউন্ড কাজের জন্য উপযুক্ত নয় :

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

তবে স্ট্যান্ডার্ড বা তৃতীয় পক্ষের কিছু এক্সটেনশন মডিউলগুলি এমনভাবে ডিজাইন করা হয়েছে যাতে সংক্ষেপণ বা হ্যাশিংয়ের মতো কম্পিউটিং-নিবিড় কাজগুলি করার সময় জিআইএলকে মুক্তি দিতে পারে। এছাড়াও, জিআইএল সর্বদা আই / ও করার সময় প্রকাশিত হয়।

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

এই উদ্ধৃতিটি সূচিত করে যে ডিক্টস এবং এইভাবে পরিবর্তনশীল অ্যাসাইনমেন্টটি সিপিথন বাস্তবায়ন বিশদ হিসাবে থ্রেড নিরাপদ:

এরপরে, প্যাকেজটির ডক্সগুলিmultiprocessing ব্যাখ্যা করে যে কীভাবে এটি স্পেসিং প্রক্রিয়া দ্বারা জিআইএলকে অতিক্রম করে যখন এর অনুরূপ একটি ইন্টারফেস প্রকাশ করে threading:

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

এবং দস্তাবেজগুলিconcurrent.futures.ProcessPoolExecutor ব্যাখ্যা করে যে এটি multiprocessingব্যাকেন্ড হিসাবে ব্যবহার করে :

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

অন্যান্য বেস ক্লাসে বিপরীত পাঠানো উচিত যা ThreadPoolExecutorযে প্রক্রিয়ার পরিবর্তে থ্রেড ব্যবহার

থ্রেডপুলএ্যাক্সিকিউটর একটি এক্সিকিউটার সাবক্লাস যা কলগুলিকে অ্যাসিঙ্ক্রোনালিভাবে চালিত করতে থ্রেডের পুল ব্যবহার করে।

যা থেকে আমরা এই সিদ্ধান্তে পৌঁছেছি যে ThreadPoolExecutorকেবলমাত্র I / O বাউন্ড কাজের জন্য উপযুক্ত, পাশাপাশি ProcessPoolExecutorসিপিইউ বাউন্ড কার্যগুলিও পরিচালনা করতে পারে।

নিম্নলিখিত প্রশ্নটি জিজ্ঞাসা করে যে জিআইএল প্রথম স্থানে রয়েছে: কেন গ্লোবাল ইন্টারপ্রেটার লক?

প্রক্রিয়া বনাম থ্রেড পরীক্ষা-নিরীক্ষা

মাল্টিপ্রসেসিং বনাম থ্রেডিং পাইথন আমি পাইথন মধ্যে থ্রেড বনাম প্রক্রিয়ার একটি পরীক্ষামূলক বিশ্লেষণ করেছি।

ফলাফলগুলির দ্রুত পূর্বরূপ:

এখানে চিত্র বর্ণনা লিখুন


0

পাইথন (সিপিথন এবং অন্যান্য) কেন জিআইএল ব্যবহার করে

Http://wiki.python.org/moin/GlobalInterpreterLock থেকে

সিপিথনে, গ্লোবাল ইন্টারপ্রেটার লক বা জিআইএল হ'ল এমন একটি মিউটেক্স যা একাধিক নেটিভ থ্রেড একবারে পাইথন বাইকোডগুলি কার্যকর করতে বাধা দেয়। এই লকটি প্রয়োজনীয় কারণ মূলত সিপিথনের মেমরি পরিচালনা থ্রেড-নিরাপদ নয়।

পাইথন থেকে এটি কীভাবে সরিয়ে ফেলা যায়?

লুয়ার মতো, পাইথনও একাধিক ভিএম শুরু করতে পারে, তবে পাইথন এটি করে না, আমার ধারণা অন্যান্য কিছু কারণ থাকতে হবে।

নম্পি বা অন্য কোনও অজগর বর্ধিত গ্রন্থাগারে, কখনও কখনও, অন্য থ্রেডে জিআইএল প্রকাশ করা পুরো প্রোগ্রামটির দক্ষতা বাড়িয়ে তুলতে পারে।


0

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

static void MyCallback(const Context &context){
Auto<Lock> lock(GetMyMutexFromContext(context));
...
EvalMyPythonString(str); //A function that takes the GIL
...    
}

এখন ক্রমানুসারে ইভেন্টগুলি বিবেচনা করুন যার ফলে একটি মৃত-লক রয়েছে।

╔═══╦════════════════════════════════════════╦══════════════════════════════════════╗
    Main Thread                             Other Thread                         
╠═══╬════════════════════════════════════════╬══════════════════════════════════════╣
 1  Python Command acquires GIL             Work started                         
 2  Computation requested                   MyCallback runs and acquires MyMutex 
 3                                          MyCallback now waits for GIL         
 4  MyCallback runs and waits for MyMutex   waiting for GIL                      
╚═══╩════════════════════════════════════════╩══════════════════════════════════════╝
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.