পাইথন মাল্টিথ্রেডিং সমর্থন করে? এটি কার্যকর করার সময়কে কী গতিময় করতে পারে?


98

পাইথনে মাল্টিথ্রেডিং কাজ করে কিনা সে সম্পর্কে আমি কিছুটা বিভ্রান্ত।

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

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

হালনাগাদ:

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

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

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

আমি মাল্টিপ্রসেসিং মডিউল সম্পর্কেও জানি কিন্তু এখনই আমার মূল আগ্রহটি ছোট থেকে মাঝারি টাস্ক লোডের জন্য (10-30 সেকেন্ড) এবং তাই আমি মনে করি মাল্টিথ্রেডিং আরও উপযুক্ত হবে কারণ সাব-প্রসেসগুলি শুরু করতে ধীর হতে পারে।


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

4
@ মিগিলসন পাইপির একটি জিআইএল আছে।

4
@ ডেলানান - আপনি সঠিক বলে মনে হচ্ছে ধন্যবাদ
মিগিলসন

4
"উপ-প্রক্রিয়াগুলি সূচনা করতে ধীর হতে পারে" - আপনি সম্পাদনের জন্য প্রস্তুত কার্যগুলির একটি পুল তৈরি করতে পারেন। ওভারহেডটি কাজ শুরু করার জন্য প্রয়োজনীয় ডেটা সিরিয়ালাইজ / ডিসরিয়ালাইজ করতে সময় লাগে প্রায় সীমাবদ্ধ হতে পারে।
ব্রায়ান কেইন

4
@ করিমবাহত, আমি যা বলতে চাইছি ঠিক এটাই।
ব্রায়ান কেইন

উত্তর:


136

জিআইএল থ্রেডিং প্রতিরোধ করে না। সমস্ত জিআইএল এটি নিশ্চিত করে যে একবারে কেবল একটি থ্রেড পাইথন কোডটি কার্যকর করছে; থ্রেডের মধ্যে এখনও স্যুইচ নিয়ন্ত্রণ করে।

জিআইএল তখন যা প্রতিরোধ করে, তা সমান্তরালে থ্রেড চালানোর জন্য একাধিক সিপিইউ কোর বা পৃথক সিপিইউ ব্যবহার করছে।

এটি কেবল পাইথন কোডে প্রযোজ্য। সি এক্সটেনশানগুলি সি কোডের একাধিক থ্রেড এবং এক পাইথন থ্রেডকে একাধিক কোর জুড়ে চলার অনুমতি দিতে GIL কে মুক্তি দিতে পারে এবং করতে পারে। এটি কার্নেল দ্বারা নিয়ন্ত্রিত I / O পর্যন্ত প্রসারিত, যেমন select()সকেট পড়ার এবং লেখার কলগুলি, পাইথন হ্যান্ডেল নেটওয়ার্ক ইভেন্টগুলিকে একাধিক-থ্রেডযুক্ত মাল্টি-কোর সেটআপে যুক্তিসঙ্গতভাবে দক্ষতার সাথে তৈরি করে।

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

দ্রষ্টব্য যে জিআইএল কেবল সিপিথন বাস্তবায়নের জন্য প্রযোজ্য; জাইথন ​​এবং আয়রন পাইথন আলাদা থ্রেডিং বাস্তবায়ন ব্যবহার করে (যথাক্রমে নেটিভ জাভা ভিএম এবং .NET সাধারণ রানটাইম থ্রেড)।

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

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


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

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

4
আমার খারাপ, আপনার আপডেট হওয়া উত্তরটি এখনও অবধি দেখেনি, যেখানে আপনি থ্রেড ব্যবহারের কয়েকটি চমৎকার উদাহরণ দিয়েছেন। এর মধ্যে রয়েছে (আইটি ভুল হলে আমাকে সংশোধন করুন) নেটওয়ার্ক প্রোগ্রামিং (উদাহরণস্বরূপ urllib.urlopen()), পাইথন Image.transform()জিইউআইয়ের মধ্যে থেকে একটি পাইথন স্ক্রিপ্ট কল করতে এবং একাধিক পিআইএল (যেমন ) কল করা এবং numpy.array()থ্রেড সহ অপারেশন (যেমন ) অপারেশন। এবং আপনি আপনার মন্তব্যে আরও কয়েকটি উদাহরণ সরবরাহ করেছেন যেমন ফাইলগুলি পড়ার জন্য একাধিক থ্রেড ব্যবহার করা (যেমন f.read()?)। আমি জানি একটি বিস্তৃত তালিকা সম্ভব নয়, কেবলমাত্র আপনি নিজের আপডেটে যে ধরণের উদাহরণ দিয়েছিলেন তা চেয়েছিলেন। যেভাবেই হোক না কেন, আপনার উত্তরটি গ্রহণ করেছেন :)
করিম বাহগাত

4
@ করিমবাহাত: হ্যাঁ, urllib.urlopen()নেটওয়ার্ক সকেট শুরু করা হবে, সকেট I / O এর জন্য অপেক্ষা করা থ্রেডগুলি স্যুইচ করার এবং অন্য কিছু করার জন্য একটি দুর্দান্ত সুযোগ opportunity
মার্টিজন পিটারস

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

4

হ্যাঁ. :)

আপনার নিম্ন স্তরের থ্রেড মডিউল এবং উচ্চ স্তরের থ্রেডিং মডিউল রয়েছে। তবে আপনি কেবল মাল্টিকোর মেশিনই ব্যবহার করতে চান, মাল্টিপ্রসেসিং মডিউলটি যাওয়ার উপায়।

দস্তাবেজগুলি থেকে উদ্ধৃতি :

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


3

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

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

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