আমাদের কখন মাল্টিপ্রসেসিং.পুল.জাইন কল করা উচিত?


96

আমি নিম্নলিখিত হিসাবে 'মাল্টিপ্রসেস.পুল.আইম্যাপ_উনর্ডার্ড' ব্যবহার করছি

from multiprocessing import Pool
pool = Pool()
for mapped_result in pool.imap_unordered(mapping_func, args_iter):
    do some additional processing on mapped_result

আমি ফোন করতে হবে pool.closeবা pool.joinলুপ জন্য পরে?


আমি পুলের সমস্ত থ্রেড একবার শুরু করার pool.join()পরে সাধারণত কল pool.close()করি তবে আমি pool.imap_unordered()পুনরাবৃত্ত হিসাবে ব্যবহার করার চেষ্টা করিনি ।
বামক্লাকুর

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

উত্তর:


113

না, আপনি না, তবে আপনি যদি পুলটি আর ব্যবহার না করে থাকেন তবে এটি সম্ভবত একটি ভাল ধারণা।

কল করার কারণগুলি pool.closeবা এই এসও পোস্টেpool.join টিম পিটার্স ভাল বলেছেন :

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

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


9
একে অপরের আগে ফোন করা কি ভাল?
RSHAP

9
দেখে মনে হয় লোকেরা pool.close()প্রথম এবং pool.join()দ্বিতীয় কল করতে পছন্দ করে । এটি আপনাকে এর মধ্যে কাজ যোগ করার অনুমতি দেয় pool.close()এবং এর pool.join()জন্য পুলটি সম্পাদন শেষ করার অপেক্ষা করতে হবে না।
বামক্লাকুর

34
কেবলমাত্র @ বামক্লাকুরের মন্তব্যে যুক্ত করার জন্য - pool.close()প্রথমে কল করা কেবল ভাল ধারণা নয় , এটি আসলে বাধ্যতামূলক। থেকে ডক্স এক কল করতে হবে close()বা terminate()ব্যবহার করার পূর্বে join()
বোগড

4
@ বোগড তবে এটি বাধ্যতামূলক কেন ? আপনি কি এই প্রশ্নের উত্তর দিতে পারেন , দয়া করে?
অগ্রুভ

অ্যাগ্রুভসের প্রশ্নের উত্তরটি দুর্দান্ত হবে!
হুইপ

44

আমি যখন মেমরি ব্যবহার করি না তখন পাইথনের মাল্টিপ্রসেসিং.পুলের সাথে মেমরির ব্যবহার বাড়তে থাকেpool.close() এবং লেভেনস্টেইনের দূরত্ব গণনা pool.join()করে pool.map()এমন কোনও ফাংশন ব্যবহার করার সময় আমার একই মেমরির সমস্যা ছিল । ফাংশনটি দুর্দান্তভাবে কাজ করেছিল, তবে একটি উইন 64৪ মেশিনে সঠিকভাবে আবর্জনা সংগ্রহ করা হয়নি, এবং পুরো অপারেটিং সিস্টেমটি নামিয়ে না ফেলা পর্যন্ত ফাংশনটি ডাকা যাওয়ার সময় মেমরির ব্যবহার নিয়ন্ত্রণের বাইরে চলে যায়। এখানে কোডটি ফাঁস স্থির করেছে:

stringList = []
for possible_string in stringArray:
    stringList.append((searchString,possible_string))

pool = Pool(5)
results = pool.map(myLevenshteinFunction, stringList)
pool.close()
pool.join()

পুলটি বন্ধ করে যোগদানের পরে স্মৃতি ফুটোটি চলে গেল।


4
আমি ERROR: Terminated with signal 15ক্লিনআপ কোড যুক্ত করার আগে পেয়ে pool.close();pool.join();যাচ্ছিলাম তবে সেই ক্লিনআপ কোড যুক্ত করার পরে আমি কনসোল বার্তা পাই না। সুতরাং আমি কমপক্ষে আমার সংস্করণে সন্দেহ করি, সি 7 থেকে অজগর ২.,, যে পুলটি সম্ভবত কোনওরকমভাবে পরিষ্কার করছে না।
ট্রেভর বয়ড স্মিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.