গ্লোবাল ইন্টারপ্রেটার লক কেন?


89

পাইথনের গ্লোবাল ইন্টারপ্রেটার লকের কাজ ঠিক কী? বাইটকোডে সংকলিত অন্যান্য ভাষাগুলি কি কি একই জাতীয় প্রক্রিয়া ব্যবহার করে?


6
আপনার জিজ্ঞাসা করা উচিত "এটি কি কোনও ব্যাপার?"
এসলট

4
আমি সম্মত, আমি এখন এটি একটি নন-ইস্যু হিসাবে বিবেচনা করছি যে ২.6 এ মাল্টিপ্রসেসিং মডিউলটি আপনাকে একটি থ্রেডের মতো একাধিক প্রক্রিয়া ব্যবহার করে প্রোগ্রাম করার অনুমতি দেওয়ার জন্য যুক্ত করা হয়েছিল। docs.python.org/library/m
মাল্টিপ্রসেসিং

উত্তর:


69

সাধারণভাবে, যে কোনও থ্রেড সুরক্ষা সমস্যার জন্য আপনার লক সহ আপনার অভ্যন্তরীণ ডেটা কাঠামো রক্ষা করতে হবে। এটি বিভিন্ন স্তরের গ্রানুলারিটির সাথে করা যেতে পারে।

  • আপনি সূক্ষ্ম দানযুক্ত লকিং ব্যবহার করতে পারেন, যেখানে প্রতিটি পৃথক কাঠামোর নিজস্ব লক থাকে।

  • আপনি মোটা দানাদার লকিং ব্যবহার করতে পারেন যেখানে একটি লক সমস্ত কিছু রক্ষা করে (জিআইএল পদ্ধতির)।

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

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

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

বাইটকোডে সংকলিত অন্যান্য ভাষাগুলি কি কি একই জাতীয় প্রক্রিয়া ব্যবহার করে?

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


4
আপনি কি এটি ব্যাখ্যা করতে পারেন: 'দুটি থ্রেড একই সাথে চলতে পারে না'? সম্প্রতি আমি পাইথনে একটি সাধারণ ওয়েবসারভার মাল্টিথ্রেডিং সহ লিখেছি। ক্লায়েন্টের প্রতিটি নতুন অনুরোধের জন্য, সার্ভারগুলি এটির জন্য একটি নতুন থ্রেড তৈরি করে এবং সেই থ্রেড চালানো চালিয়ে যায়। সুতরাং একই সময়ে একাধিক থ্রেড চলবে? নাকি ভুল ভাবে বুঝেছি?
avi

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

4
^ সুতরাং যে কোনও সময়, কেবলমাত্র একটি থ্রেড ক্লায়েন্টকে সামগ্রী সরবরাহ করবে ... সুতরাং কার্য সম্পাদনকে উন্নত করতে মাল্টিথ্রেডিং ব্যবহার করার আসলে কোনও বিষয় নেই। ঠিক?
এভিআই

এবং, অবশ্যই, জাভা বাইট কোডে সংকলিত এবং খুব সূক্ষ্ম দানাদার লকিংয়ের অনুমতি দেয়।
ওয়ারেন শিশির

4
@ আভি, ওয়েবসভারের মতো আইও বাউন্ড প্রক্রিয়াটি পাইথন থ্রেড থেকে এখনও লাভ করতে পারে। দুই বা ততোধিক থ্রেড একই সাথে আইও করতে পারে। এগুলি কেবল একই সাথে ব্যাখ্যা করা যায় না (সিপিইউ)।
সাইপ্র

33

নিম্নলিখিত সরকারী পাইথন / সি এপিআই রেফারেন্স ম্যানুয়াল থেকে :

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

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

আমি মনে করি এটি বেশ ভালভাবে ইস্যুটি সংযুক্ত করে।


4
আমি এটিও পড়েছি, তবে আমি বুঝতে পারি না পাইথন কেন এই দিক থেকে আলাদা, বলুন, জাভা (এটি?)
ফেডেরিকো এ রামপনি

@ এলিবেেন্ডারস্কি পাইথন থ্রেডগুলি পাইথ্রেড হিসাবে প্রয়োগ করা হয় এবং ওএস ( dabeaz.com/python/UndersistanceGIL.pdf ) দ্বারা পরিচালিত হয় যেখানে জাভা থ্রেডগুলি অ্যাপ্লিকেশন স্তরের থ্রেড যা
শিডিউলিং

19

গ্লোবাল ইন্টারপ্রেটার লক হ'ল একটি বড় মিউটেক্স-টাইপ লক যা রেফারেন্স কাউন্টারগুলিকে হোজে যাওয়ার হাত থেকে রক্ষা করে। আপনি যদি খাঁটি অজগর কোডটি লিখতে থাকেন তবে পর্দার আড়ালে এইগুলি ঘটে থাকে তবে আপনি পাইথনকে সিটিতে এম্বেড করে রাখলে আপনাকে স্পষ্টভাবে লকটি নিতে / ছেড়ে দিতে হতে পারে।

পাইথন বাইকোডে সংকলিত হওয়ার সাথে এই প্রক্রিয়া সম্পর্কিত নয়। এটি জাভা জন্য প্রয়োজন হয় না। আসলে, এটি জাইথনের জন্যও নেই (পাইথনটি jvm তে সংকলিত)।

আরো দেখুন এই প্রশ্নের


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

11

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

পৃথক পাইথন থ্রেডগুলি প্রায়শই প্রায়শই লকটিকে সাইকেল চালিয়ে দোভাষী দ্বারা সমবায়ভাবে মাল্টিটাস্ক করা হয়।

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

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


মোটা দানাদার লকিং সবচেয়ে বেশি ভাবার চেয়ে বেশি ব্যবহার করা হয়, এই বিষয়টি উল্লেখ করার জন্য +1, বিশেষত টেল-বিস্মৃত বিকেএল (আমি ব্যবহার করি reiserfs- এটি সম্পর্কে আমি জানি না এমন একমাত্র আসল কারণ)।
new123456

4
লিনাক্সের বিকেএল ছিল, সংস্করণ ২.6.৩৯ থেকে, বিকেএল পুরোপুরি সরানো হয়েছে।
এভিআই

4
অবশ্যই. আপনার মনে আছে যে আমি প্রশ্নের উত্তর দেওয়ার 3 বছর পরে। =)
এডওয়ার্ড কেএমইটিটি

7

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

পাইথনে, থ্রেডগুলি দেশীয় হয় এবং জিআইএল কেবল তাদের আলাদা আলাদা কোরগুলিতে চলতে বাধা দেয়।

পার্লে, থ্রেডগুলি আরও খারাপ। তারা কেবল পুরো দোভাষীকে অনুলিপি করে এবং পাইথনের মতো ব্যবহারযোগ্য হতে পারে না।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.