পাইথন 3 এ মাল্টিপ্রেসিং বনাম মাল্টিথ্রেডিং বনাম অ্যাসিনসিও


114

আমি পাইথন ৩.৪-তে মাল্টিপ্রসেসিং / থ্রেডিংয়ের জন্য কয়েকটি পৃথক গ্রন্থাগার রয়েছে: মাল্টিপ্রসেসিং বনাম থ্রেডিং বনাম অ্যাসিনসিও

তবে আমি জানি না কোনটি ব্যবহার করবেন বা এটি "প্রস্তাবিত"। তারা কি একই কাজ করে, না আলাদা? যদি তাই হয় তবে কোনটি কোনটির জন্য ব্যবহৃত হয়? আমি এমন একটি প্রোগ্রাম লিখতে চাই যা আমার কম্পিউটারে মাল্টিকোর ব্যবহার করে। তবে আমার কোন গ্রন্থাগারটি শিখতে হবে তা আমি জানি না।


উত্তর:


84

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

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


7
উল্লেখ করে যে তিনটিই সমান্তরালতা অর্জন করতে পারে না, তারা সকলেই একযোগে (অ-অবরুদ্ধকরণ) কাজ করতে সক্ষম।
সারগাস

72

[দ্রুত উত্তর]

টিএল; ডিআর

সঠিক পছন্দ করা:

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

if io_bound:
    if io_very_slow:
        print("Use Asyncio")
    else:
        print("Use Threads")
else:
    print("Multi Processing")
  • সিপিইউ বাউন্ড => মাল্টি প্রসেসিং
  • আই / ও সীমা, দ্রুত আই / ও, সংযোগের সীমাবদ্ধ সংখ্যা => মাল্টি থ্রেডিং
  • আই / ও বাউন্ড, স্লো আই / ও, অনেক সংযোগ => অ্যাসিনসিও

রেফারেন্স


[ দ্রষ্টব্য ]:


[আপডেট (2019)]:

  • জাপান্টো ( গিটহাব ) ইউভলুপের উপর ভিত্তি করে একটি খুব দ্রুত পাইপলাইনিং এইচটিটিপি সার্ভার ।

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

4
@ মেমচাউ, হ্যাঁ, তবে মনে রাখবেন, আপনি asyncioযখন অপেক্ষমান ফাংশনগুলি ব্যবহার করেন তখন থেকে আপনি ব্যবহার করতে পারেন, requestগ্রন্থাগারটি একটি অপেক্ষারত পদ্ধতি নয়, এর পরিবর্তে আপনি aiohttpলাইব্রেরি বা অ্যাসিঙ্ক-অনুরোধ এবং ইত্যাদি ব্যবহার করতে পারেন
বেনিয়ামিন জাফারি

দয়া করে মাল্টিথ্রিড বা অ্যাসিনসিও> যেতে স্লোআইও এবং ফাস্টআইওতে বাড়িয়ে দিন?
qrtLs


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

9

এটি মূল ধারণা:

এটা কি আইও- বাউন্ড? ---------> ব্যবহার করুনasyncio

এটি কি সিপিইউ -হ্যাভি? -----> ব্যবহার করুনmultiprocessing

ELSE? ----------------------> ব্যবহার করুনthreading

সুতরাং আপনার আইও / সিপিইউ সমস্যা না থাকলে মূলত থ্রেডিংয়ে আটকে থাকুন।


4

ইন মাল্টিপ্রসেসিং আপনি একাধিক CPU- র লিভারেজ আপনার গণনার বিতরণ করতে। যেহেতু প্রতিটি সিপিইউ সমান্তরালে চলে তাই আপনি কার্যকরভাবে একসাথে একাধিক টাস্ক চালাতে সক্ষম হন। আপনি সিপিইউ-সুনির্দিষ্ট কাজের জন্য মাল্টিপ্রসেসিং ব্যবহার করতে চান । একটি উদাহরণ একটি বিশাল তালিকার সমস্ত উপাদানগুলির একটি যোগফল গণনা করার চেষ্টা করবে। যদি আপনার মেশিনে 8 টি কোর থাকে তবে আপনি তালিকাটি 8 টি ছোট তালিকায় "কাটা" করতে পারেন এবং সেই তালিকাগুলির প্রতিটিের যোগফল পৃথক কোরে আলাদাভাবে গণনা করতে পারেন এবং তারপরে কেবল সেই সংখ্যাগুলি যুক্ত করুন। এটি করে আপনি ~ 8x স্পিডআপ পাবেন।

(বহু) থ্রেডিংয়েআপনার একাধিক সিপিইউ দরকার নেই। এমন কোনও প্রোগ্রামের কল্পনা করুন যা ওয়েবে প্রচুর HTTP অনুরোধ প্রেরণ করে। আপনি যদি একক থ্রেডেড প্রোগ্রাম ব্যবহার করেন তবে এটি প্রতিটি অনুরোধে কার্যকর করা (ব্লক) থামিয়ে দেবে, প্রতিক্রিয়াটির জন্য অপেক্ষা করবে এবং তারপরে একবার প্রতিক্রিয়া পাওয়ার পরে চালিয়ে যাবে। এখানে সমস্যাটি হ'ল আপনার সিপিইউ কাজটি করার জন্য কোনও বাহ্যিক সার্ভারের জন্য অপেক্ষা করার সময় সত্যিই কাজ করছে না; ইতিমধ্যে এটি কিছু কার্যকর কাজ করতে পারে! ফিক্সটি হ'ল থ্রেডগুলি ব্যবহার করা - আপনি সেগুলি অনেকগুলি তৈরি করতে পারেন, প্রতিটি ওয়েব থেকে কিছু সামগ্রী অনুরোধ করার জন্য দায়ী। থ্রেডগুলি সম্পর্কে দুর্দান্ত জিনিসটি হ'ল, যদিও তারা একটি সিপিইউতে চলে, সিপিইউ সময়ে সময়ে একটি থ্রেডের কার্যকারিতা "স্থির করে" এবং অন্যটির সম্পাদন করতে ঝাঁপিয়ে পড়ে (একে কনটেক্সট স্যুইচিং বলা হয় এবং এটি অ-নির্জনবাদী ক্রমাগত ঘটে থাকে) অন্তর)। - থ্রেডিং ব্যবহার করুন।

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


যদি আমার একাধিক থ্রেড থাকে এবং তারপরে আমি প্রতিক্রিয়াগুলি দ্রুত পেতে শুরু করি - এবং প্রতিক্রিয়াগুলির পরে আমার কাজটি আরও সিপিইউ আবদ্ধ হয় - তবে কি আমার প্রক্রিয়াটি একাধিক কোর ব্যবহার করবে? যে, এটি একাধিক কোর ব্যবহারের পরিবর্তে থ্রেডগুলি স্থির করে দেবে?
উচ্চাকাঙ্ক্ষী 1

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

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