জিউলিও ফ্রাঙ্কো যা বলে তা সাধারণভাবে মাল্টিথ্রেডিং বনাম মাল্টিপ্রসেসিংয়ের ক্ষেত্রে সত্য ।
তবে পাইথন * এর একটি যুক্ত সমস্যা রয়েছে: এখানে একটি গ্লোবাল ইন্টারপ্রেটার লক রয়েছে যা একই প্রক্রিয়াতে দুটি থ্রেড একই সাথে পাইথন কোড চালানো থেকে বাধা দেয়। এর অর্থ হ'ল যদি আপনার কাছে 8 টি কোর থাকে এবং 8 টি থ্রেড ব্যবহারের জন্য আপনার কোড পরিবর্তন করে তবে এটি 800% সিপিইউ ব্যবহার করতে সক্ষম হবে না এবং 8x দ্রুত চালাতে পারবে না; এটি একই 100% সিপিইউ ব্যবহার করবে এবং একই গতিতে চলবে। (বাস্তবে, এটি কিছুটা ধীর গতিতে চলবে, কারণ থ্রেডিং থেকে অতিরিক্ত ওভারহেড রয়েছে, যদিও আপনার কাছে কোনও ভাগ করা ডেটা না থাকলেও, আপাতত এটিকে উপেক্ষা করুন))
এই ব্যতিক্রম আছে। যদি আপনার কোডটির ভারী গণনা আসলে পাইথনে না ঘটে তবে কিছু লাইব্রেরিতে কাস্টম সি কোড সহ উপযুক্ত জিআইএল হ্যান্ডলিংয়ের মতো একটি নমাই অ্যাপের মতো আপনি থ্রেডিং থেকে প্রত্যাশিত পারফরম্যান্স সুবিধা পাবেন। ভারী গণনা যদি আপনি চালিত এবং অপেক্ষা করেন এমন কোনও উপ-প্রসেস দ্বারা করা হয় তবে এটি একই true
আরও গুরুত্বপূর্ণ বিষয় হল, এমন কিছু ক্ষেত্রে রয়েছে যেখানে এটি কোনও বিষয় নয়। উদাহরণস্বরূপ, একটি নেটওয়ার্ক সার্ভার তার বেশিরভাগ সময় নেটওয়ার্ক থেকে প্যাকেট পড়তে ব্যয় করে এবং একটি জিইউআই অ্যাপ্লিকেশন বেশিরভাগ সময় ব্যবহারকারী ইভেন্টগুলির জন্য অপেক্ষা করে। কোনও নেটওয়ার্ক সার্ভার বা জিইউআই অ্যাপ্লিকেশনে থ্রেড ব্যবহার করার একটি কারণ হ'ল পরিষেবা থ্রেড প্যাকেট বা জিইউআই ইভেন্টগুলি চালিয়ে যাওয়া থেকে মূল থ্রেডটি থামিয়ে না দিয়ে দীর্ঘকালীন "ব্যাকগ্রাউন্ড টাস্ক" করার অনুমতি দেওয়া। এবং এটি পাইথন থ্রেডগুলির সাথে ঠিক কাজ করে। (প্রযুক্তিগত ভাষায়, এর অর্থ পাইথন থ্রেডগুলি আপনাকে সম্মতি দেয়, যদিও তারা আপনাকে মূল-সমান্তরালতা দেয় না))
তবে আপনি যদি খাঁটি পাইথনে সিপিইউ-বাউন্ড প্রোগ্রাম লিখছেন তবে আরও থ্রেড ব্যবহার করা সাধারণত কার্যকর হয় না।
পৃথক প্রক্রিয়াগুলি ব্যবহার করে জিআইএল-তে কোনও সমস্যা নেই, কারণ প্রতিটি প্রক্রিয়াটির নিজস্ব পৃথক জিআইএল রয়েছে। অবশ্যই আপনার কাছে থ্রেড এবং প্রক্রিয়াগুলির মধ্যে অন্য যে কোনও ভাষার মতো একই বাণিজ্য রয়েছে threads থ্রেডের মধ্যে প্রক্রিয়াগুলির মধ্যে ডেটা ভাগ করা আরও কঠিন এবং ব্যয়বহুল, বিশাল সংখ্যক প্রক্রিয়া চালানো বা তৈরি করা এবং ধ্বংস করা ব্যয়বহুল হতে পারে এগুলি ঘন ঘন ইত্যাদি But কিন্তু জিআইএল প্রক্রিয়াগুলির প্রতি ভারসাম্যের উপর খুব বেশি ওজন করে a এমন উপায়ে যা সি বা জাভার পক্ষে সত্য নয় say সুতরাং, আপনি সি বা জাবার চেয়ে পাইথনে বহুবার মাল্টিপ্রসেসিং ব্যবহার করছেন।
এদিকে পাইথনের "ব্যাটারি অন্তর্ভুক্ত" দর্শন কিছু সুসংবাদ এনেছে: কোডটি লেখা খুব সহজ যে এক-লাইনের পরিবর্তনের মাধ্যমে থ্রেড এবং প্রক্রিয়াগুলির মধ্যে পিছনে পিছনে পরিবর্তন করা যায়।
আপনি যদি নিজের কোডটি স্ব-অন্তর্ভুক্ত "কাজের" পদে ডিজাইন করেন যা ইনপুট এবং আউটপুট ব্যতীত অন্য কাজের (বা মূল প্রোগ্রাম) এর সাথে কিছু ভাগ করে না, আপনি concurrent.futures
একটি থ্রেড পুলের চারপাশে আপনার কোডটি লিখতে পাঠাগারটি ব্যবহার করতে পারেন :
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
executor.submit(job, argument)
executor.map(some_function, collection_of_independent_things)
# ...
এমনকি আপনি এই চাকরিগুলির ফলাফল পেতে এবং সেগুলিকে পরবর্তী চাকরিতে স্থান দিতে পারেন, কার্য সম্পাদনের ক্ষেত্রে বা সমাপ্তির ক্রম ইত্যাদির জন্য অপেক্ষা করতে পারেন; Future
বিশদগুলির জন্য অবজেক্টগুলির বিভাগটি পড়ুন ।
এখন, যদি এটি সক্রিয় হয় যে আপনার প্রোগ্রামটি নিয়মিত 100% সিপিইউ ব্যবহার করে চলেছে এবং আরও থ্রেড যুক্ত করা এটি ধীর করে তোলে তবে আপনি জিআইএল সমস্যা নিয়ে চলেছেন, সুতরাং আপনাকে প্রক্রিয়াগুলিতে স্যুইচ করতে হবে। আপনাকে যা করতে হবে তা হ'ল প্রথম লাইনটি পরিবর্তন করা:
with concurrent.futures.ProcessPoolExecutor(max_workers=4) as executor:
একমাত্র আসল সতর্কতাই হ'ল আপনার কাজের আর্গুমেন্ট এবং রিটার্ন মানগুলি বাছাইযোগ্য হতে হবে (এবং খুব বেশি সময় বা স্মৃতি নিতে না পারা) ব্যবহারযোগ্য ক্রস প্রক্রিয়া হতে পারে। সাধারণত এটি কোনও সমস্যা নয়, তবে কখনও কখনও এটি হয়।
কিন্তু যদি আপনার কাজগুলি স্বনির্ভর না হয়ে যায়? যদি আপনি এমন কোনও কাজের ক্ষেত্রে আপনার কোডটি ডিজাইন করতে পারেন যা একের পর এক বার্তা পাঠায় তবে এটি এখনও বেশ সহজ। আপনাকে পুলগুলিতে নির্ভর করতে threading.Thread
বা multiprocessing.Process
তার পরিবর্তে ব্যবহার করতে হতে পারে । এবং আপনাকে স্পষ্টভাবে তৈরি queue.Queue
বা multiprocessing.Queue
অবজেক্ট তৈরি করতে হবে । (এখানে প্রচুর অন্যান্য বিকল্প রয়েছে — পাইপ, সকেট, পশুর সাথে ফাইলগুলি,… তবে মুল বক্তব্যটি হ'ল যদি কোনও নির্বাহকের স্বয়ংক্রিয় যাদু অপর্যাপ্ত থাকে তবে আপনাকে ম্যানুয়ালি কিছু করতে হবে ))
তবে আপনি যদি বার্তা পাসের উপরও নির্ভর করতে না পারেন তবে কী করবেন? যদি আপনার উভয়কে একই কাঠামোর পরিবর্তন করতে এবং একে অপরের পরিবর্তনগুলি দেখতে দুটি কাজের প্রয়োজন হয়? সেক্ষেত্রে আপনাকে ম্যানুয়াল সিঙ্ক্রোনাইজেশন করতে হবে (লকস, সেমফোরস, শর্তাদি ইত্যাদি) এবং যদি আপনি প্রক্রিয়াগুলি ব্যবহার করতে চান তবে স্পষ্টভাবে ভাগ করা মেমরি অবজেক্টগুলি বুট করতে পারেন। এটি যখন মাল্টিথ্রেডিং (বা মাল্টিপ্রসেসিং) কঠিন হয়ে যায়। যদি আপনি এড়াতে পারেন, দুর্দান্ত; যদি আপনি না পারেন তবে আপনাকে এসও উত্তর দেওয়ার চেয়ে আরও বেশি কিছু পড়তে হবে।
একটি মন্তব্য থেকে, আপনি পাইথনের থ্রেড এবং প্রক্রিয়াগুলির মধ্যে কী আলাদা তা জানতে চেয়েছিলেন। সত্যিই, আপনি যদি জিউলিও ফ্রাঙ্কোর উত্তর এবং আমার এবং আমাদের সমস্ত লিঙ্কগুলি পড়েন তবে এতে সমস্ত কিছু আবরণ করা উচিত ... তবে একটি সংক্ষিপ্তসার অবশ্যই কার্যকরভাবে কার্যকর হবে, তাই এখানে যায়:
- থ্রেডগুলি ডিফল্টরূপে ডেটা ভাগ করে; প্রক্রিয়া না।
- (1) এর ফলস্বরূপ, প্রক্রিয়াগুলির মধ্যে ডেটা প্রেরণের জন্য সাধারণত এটি বাছাই করা এবং আন-পিক করা প্রয়োজন। **
- (1) এর অন্য ফলাফল হিসাবে, প্রক্রিয়াগুলির মধ্যে সরাসরি ডেটা ভাগ করে নেওয়ার জন্য সাধারণত এটি মান, অ্যারে এবং
ctypes
প্রকারের মতো নিম্ন-স্তরের ফর্ম্যাটগুলিতে স্থাপন করা প্রয়োজন ।
- প্রক্রিয়াগুলি জিআইএল সাপেক্ষে নয়।
- কিছু প্ল্যাটফর্মে (মূলত উইন্ডোজ), প্রক্রিয়াগুলি তৈরি এবং ধ্বংস করতে অনেক বেশি ব্যয়বহুল।
- প্রক্রিয়াগুলিতে কিছু অতিরিক্ত বিধিনিষেধ রয়েছে, যার কয়েকটি বিভিন্ন প্ল্যাটফর্মগুলিতে আলাদা। বিশদ জন্য প্রোগ্রামিং গাইডলাইন দেখুন ।
threading
মডিউল বৈশিষ্ট্য কিছু নেই multiprocessing
মডিউল। (আপনি multiprocessing.dummy
থ্রেডগুলির শীর্ষে বেশিরভাগ অনুপস্থিত এপিআই পেতে ব্যবহার করতে পারেন , বা আপনি concurrent.futures
এটি সম্পর্কে উদ্বিগ্ন না হয়ে উচ্চ স্তরের মডিউলগুলি ব্যবহার করতে পারেন ))
* এটি আসলে পাইথন নয়, যে ভাষাটি এই সমস্যাটি নিয়েছে, তবে সিপিথন, সেই ভাষার "মানক" বাস্তবায়ন। অন্য কিছু বাস্তবায়নে জিলনের মতো জিআইএল নেই।
** আপনি যদি একাধিক প্রসেসিংয়ের জন্য কাঁটা শুরু করার পদ্ধতিটি ব্যবহার করেন most যা আপনি বেশিরভাগ নন-উইন্ডোজ প্ল্যাটফর্মগুলিতে করতে পারেন — প্রতিটি শিশু প্রক্রিয়া সন্তানের শুরু হওয়ার সময় পিতামাতার যে কোনও সংস্থান পায়, যা বাচ্চাদের কাছে ডেটা প্রেরণের অন্য উপায় হতে পারে।
Thread
(_thread
পাইথন 3.x নামে পরিচিত )। সত্যি কথা বলতে কি আমি নিজের মধ্যে পার্থক্যগুলি কখনই বুঝতে পারি নি ...