পাইথনকে জিআইএল নিয়ে লেখা হয়েছিল কেন?


112

গ্লোবাল ইন্টারপ্রেটার লক (জিআইএল) প্রায়শই থ্রেডিংয়ের একটি প্রধান কারণ হিসাবে উল্লেখ করা হয় এবং এর মতো পাইথনের একটি স্পর্শকর কৌশল - যা প্রশ্নটি উত্থাপন করে "এটি প্রথম স্থানে কেন হয়েছিল?"

প্রোগ্রামার না হওয়ায়, আমি এর কোনও কারণ খুঁজে পাইনি কেন এটি হতে পারে - জিআইএল-এ রাখার পিছনে যুক্তি কী ছিল?


10
Wikipedia নিবন্ধটি যে "Gil উপমা-একটি মূল্য ভাষার গতিশীলতা থাকার জন্য অর্থ প্রদান করার জন্য একটি গুরুত্বপূর্ণ বাধা হতে পারে না" , এবং বলতে চাই যে যায় "এই ধরনের একটি লক নিযুক্ত কারণ রয়েছে: একক থ্রেডেড প্রোগ্রাম বর্ধিত গতি (পৃথকভাবে সমস্ত ডেটা স্ট্রাকচারে লকগুলি অর্জন বা প্রকাশের প্রয়োজন নেই), এবং সি লাইব্রেরির সহজ সংহতকরণ যা সাধারণত থ্রেড-নিরাপদ নয় ""
রবার্ট হার্ভে

3
@ রবার্টহারভে, ডায়নামিজমের সাথে এর কোনও যোগসূত্র নেই। সমস্যাটি হল মিউটেশন।
ড্যান_ওয়াটারওয়ার্থ


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

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

উত্তর:


105

পাইথনের বেশ কয়েকটি বাস্তবায়ন রয়েছে, উদাহরণস্বরূপ, সিপিথন, আয়রন পাইথন, আরপিথন ইত্যাদি

কারও কারও জিআইএল আছে, কারও কাছে নেই। উদাহরণস্বরূপ, সিপথনের জিআইএল রয়েছে:

Http://en.wikedia.org/wiki/Global_Interpreter_Lock থেকে

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

জিআইএল এর সুবিধা

  • একক থ্রেডেড প্রোগ্রামগুলির গতি বৃদ্ধি পেয়েছে।
  • সি লাইব্রেরির সহজ সংহতকরণ যা সাধারণত থ্রেড-নিরাপদ থাকে না।

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

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

জিআইএল বিতর্কিত কারণ এটি মাল্টিথ্রেডেড সিপিথন প্রোগ্রামগুলিকে নির্দিষ্ট পরিস্থিতিতে মাল্টিপ্রসেসর সিস্টেমগুলির পুরো সুবিধা নিতে বাধা দেয়। নোট করুন যে সম্ভাব্যভাবে ব্লক করা বা দীর্ঘ-চলমান ক্রিয়াকলাপগুলি, যেমন I / O, চিত্র প্রক্রিয়াজাতকরণ, এবং NumPy নম্বর ক্রাঞ্চিং, জিআইএল এর বাইরে ঘটে। সুতরাং এটি কেবল বহুগঠিত প্রোগ্রামগুলিতেই জিআইএল-এর ভিতরে প্রচুর সময় ব্যয় করে সিপিথন বাইটকোডকে ব্যাখ্যা করে, জিআইএল একটি বাধা হয়ে দাঁড়ায়।

পাইথনের একটি জিআইএল রয়েছে বেশ কয়েকটি কারণে জরিমানাযুক্ত লক করার বিপরীতে:

  • এটি একক থ্রেডেড ক্ষেত্রে দ্রুত হয়।

  • আই / ও বাউন্ড প্রোগ্রামগুলির জন্য এটি বহু-থ্রেডযুক্ত ক্ষেত্রে দ্রুত is

  • সিপিইউ-বাউন্ড প্রোগ্রামগুলির জন্য মাল্টি-থ্রেডড ক্ষেত্রে এটি দ্রুততর হয় যা সি লাইব্রেরিতে তাদের সংখ্যার নিবিড় কাজ করে।

  • এটি সি এক্সটেনশানগুলি লিখতে আরও সহজ করে তোলে: পাইথন থ্রেডগুলির কোনও স্যুইচ থাকবে না যেখানে আপনি এটি হওয়ার অনুমতি দিচ্ছেন (অর্থাত্ পাই_বিএসএলএলএলও_ THREADS এবং পাই_ END_ALLOW_THREADS ম্যাক্রোর মধ্যে)।

  • এটি সি লাইব্রেরি মোড়ানো সহজ করে তোলে। থ্রেড-সুরক্ষা সম্পর্কে আপনাকে চিন্তা করতে হবে না। লাইব্রেরি যদি থ্রেড-নিরাপদ না থাকে, আপনি জিআইএলকে কল করার সময় লক করে রাখেন।

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

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

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

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

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


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

9
s/RPython/PyPy/g। @ মিশেলবার্গওয়ার্ট জিআইএল-এর পক্ষে যুক্তি প্রদান করা প্রশ্নটির মূল বিষয়, তাই না? যদিও আমি সম্মত হব যে এই উত্তরের কিছু বিষয়বস্তু (বিকল্পগুলির নাম হিসাবে আলোচনা) মূল্যের পাশে রয়েছে। এবং আরও ভাল বা আরও খারাপের জন্য, রিফকাউন্টিংয়ের হাত থেকে মুক্তি পাওয়া এখন প্রায় অসম্ভব - এটি পুরো API এবং কোড বেসে গভীরভাবে জড়িত; অর্ধেক কোড পুনর্লিখন এবং সমস্ত বাহ্যিক কোড ভঙ্গ না করে এ থেকে মুক্তি পাওয়া প্রায় অসম্ভব ।

10
multiprocessingগ্রন্থাগারটি ভুলে যাবেন না - ২. 2. থেকে স্ট্যান্ডার্ড। এটি কর্মী পুলগুলি কিছু সাধারণ ধরণের সমান্তরালতার জন্য একটি সুপার-স্লিক বিমূর্ততা।
শান ম্যাকসোমিংথ

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

8
উইন্ডোজ ব্যতীত অন্য প্ল্যাটফর্মগুলিতে থ্রেড বিদ্যমান রয়েছে তা প্রমাণ হওয়া উচিত যে প্রতিটি পরিস্থিতিতে কাঁটাচামচ যথেষ্ট নয়।
জেনাক

42

প্রথম বন্ধ: পাইথনের জিল নেই। পাইথন একটি প্রোগ্রামিং ভাষা। একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ বিমূর্ত গাণিতিক নিয়ম এবং বিধিনিষেধের একটি সেট। পাইথন ল্যাঙ্গুয়েজ স্পেসিফিকেশনে এমন কিছু নেই যা বলে যে একটি জিআইএল থাকতে হবে।

পাইথনের বিভিন্ন প্রয়োগ রয়েছে। কারও কাছে জিআইএল আছে, কারও কাছে নেই।

জিআইএল থাকার একটি সহজ ব্যাখ্যা হ'ল সমবর্তী কোড লেখা শক্ত। আপনার কোডের চারদিকে একটি বিশাল লক স্থাপন করে আপনি এটিকে সর্বদা ক্রমিকভাবে চালাতে বাধ্য করেন। সমস্যা সমাধান!

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


6
জাভা এর স্বাক্ষরযুক্ত সংখ্যাযুক্ত ধরণের অভাবের মতোই এটি একই যুক্তি - বিকাশকারীরা মনে করেন যে অন্যরা তাদের চেয়ে আরও নিবিড় ...
বেসিক

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

@ জুলেস হ্যাঁ, যতক্ষণ না আপনার এই দক্ষতার প্রয়োজন হয় ততক্ষণ পর্যন্ত এটি খুব কার্যকর। সিপাইথনের "পছন্দের" সমাধানটির সমাধান "সি ++ এর মতো অন্য ভাষায় লিখুন" তারপরে আপনি প্রতিটি অজগর সুবিধা হারাবেন। আপনি যদি আপনার অর্ধেক কোডটি সি ++ তে লিখছেন তবে পাইথন থেকে কেন শুরু করবেন? অবশ্যই, ছোট এপিআই / আঠালো প্রকল্পগুলির জন্য এটি দ্রুত এবং সহজ এবং ইটিএল-র জন্য এটি কারওর পরে নয়, তবে এটি ভারী উত্তোলনের প্রয়োজন এমন কোনও কিছুর জন্য উপযুক্ত নয়। হার্ডওয়্যার সাথে কথা বলার জন্য জাভা ব্যবহার করার মতোই ... এটি আপনার কাছে ঝাঁপিয়ে পড়ে প্রায় হাস্যকর।
বেসিক

16

জিআইএল এর উদ্দেশ্য কী?

CAPI ডকুমেন্টেশনের বিষয়ে এই কথাটি রয়েছে:

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

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

বিকল্পগুলি কি?

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


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

জিআইএল থাকা সত্ত্বেও আমি মডিউল পাইডবিসি ব্যবহারের অযত্ন ব্যবহারের কারণে একটি বহুবিধ প্রোগ্রামে অংশবিভাজন ত্রুটি তৈরি করতে পেরেছি। সুতরাং "কখনই বিভাগের ত্রুটি তৈরি করা উচিত নয়" এটি একটি মিথ্যাবাদ।
মুপোসাত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.