পাইথনগুলিতে থ্রেডগুলি কীভাবে কাজ করে এবং পাইথন-থ্রেডিং সুনির্দিষ্ট সমস্যাগুলি কী কী?


85

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

আমি যা বলতে পারি তা থেকে একবারে কেবল একটি থ্রেড চলতে পারে এবং সক্রিয় থ্রেড প্রতি 10 টি নির্দেশ বা স্যুইচ করে?

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

উত্তর:


51

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

শেষ লিঙ্কটি থেকে একটি আকর্ষণীয় উদ্ধৃতি:

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

আপনি যদি মাল্টি কোর ব্যবহার করতে চান তবে পাইপ্রোসেসিং প্রকৃত সমান্তরালতা করতে কোনও প্রক্রিয়া ভিত্তিক এপিআইকে সংজ্ঞায়িত করে। PEP এছাড়াও কিছু মজার benchmarks অন্তর্ভুক্ত করা হয়েছে।


4
স্মুথস্প্যানের উদ্ধৃতিতে আসলেই একটি মন্তব্য: মেশিনের বেশ কয়েকটি থাকলেও পাইথন থ্রেডিং কার্যকরভাবে আপনাকে একটি কোরে সীমাবদ্ধ করে দেয়? মাল্টিকোর থেকে উপকার পাওয়া যেতে পারে কারণ পরবর্তী থ্রেড প্রসঙ্গের সুইচ ছাড়াই প্রস্তুত হতে পারে তবে আপনার পাইথন থ্রেডগুলি একবারে> 1 কোর ব্যবহার করতে পারে না।
জেমস ব্র্যাডি

4
সঠিক, পাইথন থ্রেডগুলি কার্যত একটি কোরের মধ্যে সীমাবদ্ধ, UN সিএস মডিউল GIL এর সাথে সুন্দরভাবে ইন্টারেক্ট করে এবং এটি নিজস্ব নিজস্ব থ্রেড চালায়।
আরাফাঙ্গিয়ন

প্রকৃতপক্ষে, একাধিক কোর থ্রেডগুলি কম দক্ষ করে তোলে কারণ প্রতিটি থ্রেড জিআইএল অ্যাক্সেস করতে পারে কিনা তা যাচাই করে প্রচুর মন্থ। এমনকি নতুন জিআইএল বুদ্ধিমান, কর্মক্ষমতা এখনও খারাপ ... dabeaz.com/python/NewGIL.pdf
বেসিক

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

পাইথনের থ্রেডগুলির মধ্যে একটি প্রসঙ্গের সুইচের কারণ কী? এটি টাইমার বিঘ্ন উপর ভিত্তি করে? ব্লকিং, বা একটি নির্দিষ্ট ফলন কল?
সিএমসিডিগ্রাগনকাই

36

পাইথন থ্রেড করার পক্ষে মোটামুটি সহজ ভাষা, তবে এখানে রয়েছে সতর্কতা। আপনার সবচেয়ে বড় জিনিসটি সম্পর্কে জানা দরকার হ'ল গ্লোবাল ইন্টারপ্রেটার লক। এটি কেবলমাত্র একটি থ্রেডকে দোভাষীর অ্যাক্সেসের অনুমতি দেয়। এর অর্থ দুটি জিনিস: 1) আপনি পাইথন এবং একটি লক স্টেটমেন্ট ব্যবহার করে খুব কমই নিজেকে খুঁজে পান 2) আপনি যদি মাল্টি-প্রসেসর সিস্টেমের সুবিধা নিতে চান তবে আপনাকে পৃথক প্রক্রিয়া ব্যবহার করতে হবে। সম্পাদনা: আমার এও উল্লেখ করা উচিত যে আপনি জিআইএলও পেতে চাইলে আপনি কিছু কোড সি / সি ++ এ রাখতে পারেন put

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

আপনি যদি প্রতিক্রিয়াশীলতা উন্নত করতে চান তবে আপনার থ্রেড ব্যবহার করে বিবেচনা করা উচিত। যদিও মাইক্রোথ্রেডিং নামে অন্য বিকল্প রয়েছে । কিছু ফ্রেমওয়ার্ক রয়েছে যা আপনার উচিত:


@ জেএস - স্থির। সেই তালিকাটি যাইহোক পুরানো ছিল।
জেসন বেকার

মাল্টি-কোর সিস্টেমের সুবিধা নেওয়ার জন্য আপনার কেবলমাত্র একাধিক প্রক্রিয়া দরকার - সমস্ত ওভারহেড যা অন্তর্ভুক্ত থাকে with আমরা 32 লজিকাল কোর সহ কিছু সার্ভার পেয়েছি - সুতরাং এগুলি দক্ষতার সাথে ব্যবহার করার জন্য আমার 32 টি প্রক্রিয়া দরকার? পাগলামি
বেসিক

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

20

নীচে একটি বেসিক থ্রেডিং নমুনা দেওয়া আছে। এটি 20 থ্রেড স্প্যান করবে; প্রতিটি থ্রেড তার থ্রেড নম্বর আউটপুট হবে। এটি চালান এবং তারা যেভাবে মুদ্রণ করেন তা পর্যবেক্ষণ করুন।

import threading
class Foo (threading.Thread):
    def __init__(self,x):
        self.__x = x
        threading.Thread.__init__(self)
    def run (self):
          print str(self.__x)

for x in xrange(20):
    Foo(x).start()

যেমনটি আপনি ইঙ্গিত করেছেন পাইথন থ্রেডগুলি সময়-কাটা করার মাধ্যমে প্রয়োগ করা হয়। এভাবেই তারা "সমান্তরাল" প্রভাবটি পান।

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

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


10

পৃথক কর্মীরা যদি I / O বাউন্ড অপারেশন করে তবে অজগরগুলিতে থ্রেড ব্যবহার করুন। আপনি যদি কোনও মেশিনে একাধিক কোর জুড়ে স্কেল করার চেষ্টা করছেন তবে হয় পাইথনের জন্য একটি ভাল আইপিসি কাঠামো খুঁজে নিন বা কোনও ভিন্ন ভাষা বেছে নিন।


6

দ্রষ্টব্য: আমি যেখানেই উল্লেখ করেছি threadআমি স্পষ্টভাবে বিবরণ না দেওয়া পর্যন্ত পাইথনে থ্রেডগুলি নির্দিষ্ট করে বলতে চাইছি ।

আপনি যদি আসেন তবে থ্রেডগুলি অজগরটিতে কিছুটা আলাদাভাবে কাজ করে C/C++ পটভূমি । অজগরটিতে, একটি নির্দিষ্ট সময়ে কেবলমাত্র একটি থ্রেড চলমান অবস্থায় থাকতে পারে his এর অর্থ অজগরের থ্রেডগুলি সত্যিকার অর্থে একাধিক প্রসেসিং কোরগুলির শক্তি অর্জন করতে পারে না কারণ নকশার দ্বারা থ্রেডগুলির পক্ষে একাধিক কোরের সাথে সমান্তরালভাবে চালানো সম্ভব নয়।

পাইথন মেমরি ব্যবস্থাপনা থ্রেড-নিরাপদ নয় প্রতিটি থ্রেড পাইথন interpreter.This ডেটা স্ট্রাকচার একটি একচেটিয়া এক্সেস একচেটিয়া এক্সেস একটি প্রক্রিয়া নামক দ্বারা অর্জিত হয় প্রয়োজন (গ্লোবাল interpretr লক)GIL

Why does python use GIL?

একাধিক থ্রেড একসাথে ইন্টারপ্রেটার স্টেটে অ্যাক্সেস করা এবং দোভাষীর স্থিতিকে কলুষিত করা থেকে বিরত রাখতে।

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

Why not simply remove GIL?

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

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

So when does thread switching occurs in python?

জিআইএল প্রকাশিত হলে থ্রেড সুইচ হয় G তাই জিআইএল কখন প্রকাশিত হয়? বিবেচনায় নেওয়ার জন্য দুটি পরিস্থিতি রয়েছে।

যদি কোনও থ্রেড সিপিইউ বাউন্ড অপারেশন করে (প্রাক্তন চিত্র প্রক্রিয়াকরণ)।

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

নতুন সংস্করণগুলিতে থ্রেডে স্যুইচ করতে মেট্রিক হিসাবে নির্দেশনা গণনাটি ব্যবহার না করে একটি কনফিগারযোগ্য সময় ব্যবধান ব্যবহৃত হয়। ডিফল্ট সুইচ ব্যবধানটি 5 মিলিসেকেন্ড y আপনি বর্তমান স্যুইচ ব্যবধানটি ব্যবহার করতে পারেনsys.getswitchinterval() । এটি ব্যবহার করে পরিবর্তন করা যেতে পারেsys.setswitchinterval()

যদি কোনও থ্রেড কিছু আইও বাউন্ড অপারেশন করে থাকে (এক্স ফাইল সিস্টেম অ্যাক্সেস বা
নেটওয়ার্ক আইও)

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

Which thread to switch to next?

দোভাষীর নিজস্ব সময়সূচী নেই r. যে থ্রেডটি বিরতি শেষে নির্ধারিত হয়ে যায় অপারেটিং সিস্টেমের সিদ্ধান্ত। ।


3

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

আপনার যদি সত্যিকারের বৃহত আকারের সমান্তরালনের প্রয়োজন হয় তবে আমি আরও তাকাতে চাই তবে আপনি যদি কেবল সমস্ত কম্পিউটার ছাড়াই কোনও কম্পিউটারের কয়েকটি কোর বা কয়েকটি আলাদা স্কেল করতে চান যা আরও বিস্তৃত কাঠামো বাস্তবায়নে চলে যায় তবে এটি আপনার জন্য than ।


2

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

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

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