আমার জন্য এটি আসলে বেশ সহজ:
Subprocess বিকল্প:
subprocess
হয় অন্যান্য এক্সেকিউটেবল চালানোর জন্য --- এটি মূলত একটি মোড়কের কাছাকাছি os.fork()
এবং os.execve()
ঐচ্ছিক নদীর গভীরতানির্ণয় জন্য কিছু সমর্থন (প্রয়োজন এবং subprocesses থেকে পাইপ স্থাপনের। একথাও ঠিক যে আপনি করতে পারে অন্যান্য আন্ত প্রক্রিয়া যোগাযোগ (আইপিসি) যেমন সকেট যেমন মেকানিজম, বা Posix বা এসআইএসভি ভাগ করে নেওয়া মেমরি But
সাধারণত, যে কোনও subprocess
সিঙ্ক্রোনালি ব্যবহার করে --- কেবল কিছু বাহ্যিক ইউটিলিটি কল করে এবং তার আউটপুটটি পড়তে বা তার সমাপ্তির অপেক্ষায় (সম্ভবত এটির ফলাফল কোনও অস্থায়ী ফাইল থেকে পড়া, অথবা এটি কোনও ডাটাবেসে পোস্ট করার পরে)।
তবে কেউ কয়েকশো সাব-প্রসেসি স্প্যান করতে এবং সেগুলি পোল করতে পারে। আমার নিজস্ব ব্যক্তিগত প্রিয় ইউটিলিটি ক্লাস ঠিক তা করে।
সবচেয়ে বড় অসুবিধা হল এর subprocess
মডিউল যে I / O সমর্থন সাধারণত ব্লক করা হয়। পাইথন ৩.x এর কিছু ভবিষ্যতের সংস্করণ এবং বিকল্প অ্যাসিঙ্কপ্রোক (সতর্কতা যা ডাউনলোডের ডানদিকে নিয়ে যায়, কোনও প্রকার ডকুমেন্টেশন বা README নয়) তা ঠিক করার জন্য একটি খসড়া পিইপি -3145 রয়েছে । আমি এটিও পেয়েছি যে কেবলমাত্র fcntl
আপনার Popen
পাইপ ফাইল বিবরণকারীকে সরাসরি আমদানি করা এবং পরিচালনা করতে এটি অপেক্ষাকৃত সহজ --- যদিও আমি জানি না যে এটি ইউনিক্স-অ প্ল্যাটফর্মের জন্য পোর্টেবল কিনা।
(আপডেট: 7 আগস্ট 2019: পাইকন 3 অয়নসিও সাবপ্রোসেসিসের জন্য সমর্থন: অ্যাসিনসিও সাবপ্রসেসিস )
subprocess
কোনও ইভেন্ট হ্যান্ডলিং সমর্থন নেই ... যদিও আপনি signal
মডিউল এবং সরল পুরাতন স্কুল ইউএনআইএক্স / লিনাক্স সংকেত ব্যবহার করতে পারেন --- আপনার প্রক্রিয়াগুলি যেমন ছিল তেমনভাবে বিনষ্ট করে দিতে পারেন।
মাল্টিপ্রসেসিং বিকল্প:
multiprocessing
হয় আপনার বিদ্যমান (পাইথন) কোড মধ্যে ফাংশন চালানোর জন্য প্রক্রিয়ার এই পরিবার মধ্যে নমনীয় যোগাযোগের জন্য সমর্থন। বিশেষত যেখানে সম্ভব multiprocessing
মডিউলটির Queue
অবজেক্টগুলির চারপাশে আপনার আইপিসি তৈরি করা সবচেয়ে ভাল তবে আপনি Event
অবজেক্টস এবং অন্যান্য বিভিন্ন বৈশিষ্ট্যও ব্যবহার করতে পারেন (যার মধ্যে কয়েকটি সম্ভবত, mmap
প্ল্যাটফর্মগুলিতে সমর্থনের আশেপাশে নির্মিত যেখানে সমর্থনটি যথেষ্ট)।
পাইথনের multiprocessing
মডিউলটি ইন্টারফেস এবং বৈশিষ্ট্যগুলি সরবরাহ করার উদ্দেশ্যে যা সিআইপিথন আপনাকে জিআইএল (গ্লোবাল ইন্টারপ্রেটার লক) সত্ত্বেও একাধিক সিপিইউ / কোরগুলির মধ্যে আপনার প্রসেসিং স্কেল করার অনুমতি দেওয়ার সাথে মিল threading
দেয় features এটি আপনার ওএস কার্নেলের বিকাশকারীদের দ্বারা করা সমস্ত সূক্ষ্ম-দানযুক্ত এসএমপি লকিং এবং সংহতিমূলক প্রচেষ্টাকে উপকৃত করে।
থ্রেডিং বিকল্প:
threading
হয় অ্যাপ্লিকেশন যা একটি মোটামুটি সংকীর্ণ পরিসীমা জন্য ইনপুট / আউটপুট আবদ্ধ এবং অত্যন্ত কম লেটেন্সি থেকে যা বেনিফিট এবং থ্রেড সুইচিং এর ওভারহেড সুইচিং (ভাগ কোর মেমরির) বনাম প্রক্রিয়া (একাধিক CPU- র কোর জুড়ে স্কেল প্রয়োজন হবে না) / প্রসঙ্গ পরিবর্তন। লিনাক্সে এটি প্রায় খালি সেট (লিনাক্স প্রক্রিয়া স্যুইচ সময়গুলি এর থ্রেড-স্যুইচের খুব কাছাকাছি থাকে)।
threading
পাইথনের দুটি বড় অসুবিধায় ভুগছে ।
অবশ্যই একটি বাস্তবায়ন নির্দিষ্ট --- বেশিরভাগ সিপিথনকে প্রভাবিত করে। এটাই গিল বেশিরভাগ অংশে, বেশিরভাগ সিপিথন প্রোগ্রাম দুটিরও বেশি সিপিইউ (কোর) এর প্রাপ্যতা থেকে উপকৃত হবে না এবং প্রায়শই পারফরম্যান্স জিআইএল লকিংয়ের কারণে ভুগবে ।
বৃহত্তর ইস্যু যা বাস্তবায়ন নির্দিষ্ট নয়, তা হ'ল থ্রেডগুলি একই মেমরি, সিগন্যাল হ্যান্ডলার, ফাইল বিবরণকারী এবং কিছু অন্যান্য ওএস সংস্থান ভাগ করে। সুতরাং প্রোগ্রামারকে অবশ্যই অবজেক্ট লকিং, ব্যতিক্রম হ্যান্ডলিং এবং তাদের কোডের অন্যান্য দিকগুলি সম্পর্কে অত্যন্ত সতর্কতা অবলম্বন করতে হবে যা উভয় সূক্ষ্ম এবং যা পুরো প্রক্রিয়াটি (থ্রেডের স্যুট) হত্যা করতে পারে, স্টল করতে পারে বা অচল করে দিতে পারে।
তুলনা করে multiprocessing
মডেল প্রতিটি প্রক্রিয়াটিকে তার নিজস্ব স্মৃতি, ফাইল বর্ণনাকারী ইত্যাদি দেয় gives এগুলির যে কোনও একটিতে ক্রাশ বা নিয়ন্ত্রণহীন ব্যতিক্রম কেবল সেই সংস্থানটিকেই মেরে ফেলবে এবং কোনও শিশু বা ভাইবোনদের অন্তর্ধানকে দৃ rob়ভাবে পরিচালনা করা ডিবাগিংয়ের চেয়ে আলাদা করা, বিচ্ছিন্নকরণ এবং থ্রেডে অনুরূপ ইস্যুগুলি ফিক্সিং বা কাজ করে।
- (দ্রষ্টব্য:
threading
বড় আকারের পাইথন সিস্টেমে যেমন নুমপাই ব্যবহার করা আপনার নিজের পাইথন কোডের তুলনায় জিআইএল-এর বিতর্ক থেকে যথেষ্ট কম ভুগতে পারে That's কারণ এগুলি করার জন্য তারা বিশেষত ইঞ্জিনিয়ার হয়েছে; নুনপাইয়ের নেটিভ / বাইনারি অংশগুলি, উদাহরণস্বরূপ, এটি নিরাপদ হলে জিআইএল মুক্তি দেবে)।
পাকান বিকল্প:
এটিও লক্ষণীয় যে টুইস্টেড আরও একটি বিকল্প প্রস্তাব দেয় যা উভয়ই মার্জিত এবং বুঝতে খুব চ্যালেঞ্জ । মূলত, মোড়কে আরও সহজ করার ঝুঁকিতে যেখানে টুইস্টের ভক্তরা পিচফোর্স এবং টর্চ নিয়ে আমার বাড়িতে ঝড় তুলতে পারে, টুইস্টেড কোনও (একক) প্রক্রিয়াটির মধ্যে ইভেন্ট-চালিত সমবায় বহুমুখী কাজ সরবরাহ করে।
এটি কীভাবে সম্ভব তা বোঝার জন্য select()
(যা নির্বাচন () বা পোল () বা অনুরূপ ওএস সিস্টেম কলগুলির চারপাশে নির্মিত যেতে পারে ) এর বৈশিষ্ট্যগুলি সম্পর্কে পড়তে হবে । মূলত এগুলি সমস্ত ফাইল বর্ণনাকারীর তালিকার কোনও তালিকা বা কিছু সময়সীমা পেরিয়ে যাওয়ার জন্য ওএসের অনুরোধটি ঘুমানোর অনুরোধ করার ক্ষমতা দ্বারা চালিত।
এই কলগুলির প্রত্যেকটি থেকে জাগ্রত select()
করা একটি ইভেন্ট --- কোনওটি সকেট বা ফাইল বর্ণনাকারীর সংখ্যায় ইনপুট উপলব্ধ (পঠনযোগ্য), বা বাফারিং স্পেসে কিছু অন্যান্য (লিখিতযোগ্য) বর্ণনাকারী বা সকেটে উপলব্ধ হয়ে ওঠে, কিছু ব্যতিক্রমী শর্ত (টিসিপি) আউট-ব্যান্ড পুশ প্যাকেটগুলি, উদাহরণস্বরূপ), বা একটি টিমিয়ুট।
সুতরাং এই ইভেন্টগুলিকে পরিচালনা করার পরে টুইস্টেড প্রোগ্রামিং মডেল তৈরি করা হয় তারপরে ফলাফলটি "প্রধান" হ্যান্ডলারটি লুপ করে এটি আপনার হ্যান্ডলারের কাছে ইভেন্টগুলি প্রেরণের অনুমতি দেয়।
আমি নামটি ব্যক্তিগতভাবে ভাবি, প্রোগ্রামিং মডেলটির উচ্ছৃঙ্খল হিসাবে টুইস্টেড ... যেহেতু সমস্যার দিকে আপনার দৃষ্টিভঙ্গিটি অবশ্যই কিছুটা হলেও ভিতরে "বাঁকা" হওয়া উচিত। ইনপুট ডেটা এবং ফলাফলগুলি বা ফলাফলগুলিতে আপনার ক্রিয়াকলাপটিকে ক্রিয়াকলাপ হিসাবে গ্রহণ করার পরিবর্তে আপনি আপনার প্রোগ্রামটিকে পরিষেবা বা ডেমন হিসাবে লিখছেন এবং এটি বিভিন্ন ইভেন্টে কীভাবে প্রতিক্রিয়া ব্যক্ত করে তা নির্ধারণ করছেন। (আসলে একটি বাঁকানো প্রোগ্রামের মূল "প্রধান লুপ" (সাধারণত? সর্বদা?) ক reactor()
)।
পাক ব্যবহার করে প্রধান চ্যালেঞ্জ ঘটনা চালিত মডেল প্রায় আপনার মন মোচড়ের এবং তার সাথে সাথে ক্লাসের লাইব্রেরি বা টুলকিট যা লেখা আছে ব্যবহার eschewing জড়িত পাক কাঠামোর মধ্যে সহ-কাজ করে। এজন্যই টুইস্টেড এসএসএইচ প্রোটোকল হ্যান্ডলিং, শাপের জন্য এবং তার নিজস্ব সাবপ্রসেস / পোপেন ফাংশন এবং অন্যান্য অনেকগুলি মডিউল এবং প্রোটোকল হ্যান্ডলার সরবরাহ করে যা প্রথমে ব্লাশ করে পাইথন স্ট্যান্ডার্ড লাইব্রেরিতে জিনিসগুলি নকল করে বলে মনে হয়।
আপনারা কখনও কখনও এটি ব্যবহার করার ইচ্ছা না থাকলেও ধারণাগত স্তরে টুইস্টটি বোঝার জন্য এটি দরকারী। এটি আপনার থ্রেডিং, মাল্টিপ্রসেসিং এবং এমনকি সাবপ্রসেসি হ্যান্ডলিংয়ের পাশাপাশি আপনার হাতে নেওয়া কোনও বিতরণ প্রক্রিয়াজাতকরণে কর্মক্ষমতা, বিতর্ক এবং ইভেন্ট হ্যান্ডলিংয়ের অন্তর্দৃষ্টি দিতে পারে।
( নোট: 3.x সহ Python- র নবীনতর সংস্করণ asyncio ) (অ্যাসিঙ্ক্রোনাস ইনপুট / আউটপুট যেমন অতিরিক্ত বৈশিষ্ট্যগুলিও উপস্থিত রয়েছে ASYNC Def , @ async.coroutine প্রসাধক, এবং অপেক্ষায় রয়েছেন কীওয়ার্ডটি এবং ফলন ভবিষ্যতে থেকে সমর্থন এই সমস্ত মোটামুটিভাবে একই রকম। একটি প্রক্রিয়া (সমবায় মাল্টিটাস্কিং) দৃষ্টিকোণ থেকে বাঁকানো । (পাইথন 3 জন্য পাক সমর্থন বর্তমান অবস্থা জন্য, চেক আউট: https://twistedmatrix.com/documents/current/core/howto/python3.html )
বিতরণ বিকল্প:
তবুও আপনি প্রক্রিয়াজাতকরণের আরও একটি ক্ষেত্র যা সম্পর্কে জিজ্ঞাসা করেননি, তবে যা বিবেচনা করার মতো, তা হ'ল বিতরণ প্রক্রিয়াজাতকরণ। বিতরণ প্রক্রিয়াকরণ এবং সমান্তরাল গণনার জন্য পাইথনের অনেকগুলি সরঞ্জাম এবং ফ্রেমওয়ার্ক রয়েছে। ব্যক্তিগতভাবে আমি মনে করি ব্যবহার করার সহজতমটি হ'ল এমন একটি যা কমপক্ষে প্রায়শই সেই স্থান হিসাবে বিবেচিত হয়।
রেডিসের চারপাশে বিতরণ প্রক্রিয়াজাতকরণটি প্রায় তুচ্ছ । পুরো কী স্টোরটি ওয়ার্ক ইউনিট এবং ফলাফলগুলি সংরক্ষণ করার জন্য ব্যবহার করা যেতে পারে, রেডিস লিস্টগুলি Queue()
অবজেক্টের মতো ব্যবহার করা যেতে পারে , এবং পিইউবি / এসইউবি সমর্থনটি পছন্দ Event
মতো হ্যান্ডলিংয়ের জন্য ব্যবহার করা যেতে পারে । আপনি আপনার কীগুলি হ্যাশ করতে পারেন এবং রেডিসের উদাহরণগুলির একটি আলগা ক্লাস্টার জুড়ে প্রতিলিপি তৈরি করা, টপোলজি এবং হ্যাশ-টোকেন ম্যাপিংগুলি সংরক্ষণ করতে আপনার কর্মীদের একত্রিত করার জন্য কোনও একক উদাহরণের ক্ষমতা ছাড়িয়ে সামঞ্জস্যপূর্ণ হ্যাশিং এবং ব্যর্থ-ওভার সরবরাহ করতে পারেন এবং মার্শালিং ডেটা (আচারযুক্ত, জেএসএন, বিএসন, বা ওয়াইএমএল)
অবশ্যই আপনি কোন বৃহত্তর স্কেল এবং Redis প্রায় আরো পরিশীলিত সমাধান নির্মাণ শুরু হিসাবে আপনি পুনরায় বাস্তবায়ন বৈশিষ্ট্য ইতিমধ্যে ব্যবহার করে, মীমাংসিত হয়েছে অনেক সেলারি , এ্যাপাচি স্পার্ক এবং Hadoop এর , Zookeeper , etcd , ক্যাসান্ড্রা ইত্যাদি। তাদের সকলের কাছে পাইথনের পরিষেবাগুলিতে অ্যাক্সেসের মডিউল রয়েছে।
[আপডেট: যদি আপনি বিতরণকারী সিস্টেমগুলিতে গণনামূলকভাবে নিবিড় জন্য পাইথন বিবেচনা করছেন তবে কয়েকটি সংস্থান বিবেচনার জন্য: আইপিথন প্যারালাল এবং পাইস্পার্ক । যদিও এটি সাধারণ উদ্দেশ্যে বিতরণ করা কম্পিউটিং সিস্টেম, সেগুলি বিশেষত অ্যাক্সেসযোগ্য এবং জনপ্রিয় উপ-সিস্টেম ডেটা বিজ্ঞান এবং বিশ্লেষণ]]
উপসংহার
সেখানে পাইথনের একক থ্রেডযুক্ত থেকে শুরু করে উপ-প্রক্রিয়াগুলিতে সাধারণ সিঙ্ক্রোনাস কল, পোল্ড সাবপ্রোসেসিসের পুল, থ্রেডড এবং মাল্টিপ্রসেসিং, ইভেন্ট-চালিত সমবায় বহুমুখী কার্যকারিতা, এবং বিতরণ প্রক্রিয়াজাতকরণের বাইরে প্রসেসিং বিকল্পগুলির প্রচলন রয়েছে।