imap/ imap_unorderedএবং map/ এর মধ্যে দুটি মূল পার্থক্য রয়েছে map_async:
- তারা যেভাবে পুনরাবৃত্তিযোগ্য তাদের গ্রাস করে।
- যেভাবে তারা আপনাকে ফলাফল ফিরিয়ে দেয়।
mapপুনরাবৃত্তিকে তালিকায় রূপান্তর করে আপনার পুনরাবৃত্তিকে গ্রাস করে (ধরে নিলেন এটি ইতিমধ্যে কোনও তালিকা নয়), এটিকে ভাঙা ভাঙা করে এবং সেই অংশগুলিকে কর্মী প্রসেসগুলিতে প্রেরণে প্রেরণ করে Pool। খণ্ডগুলিতে পুনরাবৃত্তি ভাঙ্গা প্রতিটি আইটেম একবারে এক আইটেম প্রসেসের মধ্যে পুনরাবৃত্তীয় মধ্যে উত্তীর্ণ সঞ্চালন করে - বিশেষত যদি পুনরাবৃত্তিযোগ্য বড় হয়। যাইহোক, পুনরাবৃত্তিকে তালিকায় পরিণত করার জন্য এটি খুব বেশি মেমরির ব্যয় করতে পারে, কারণ পুরো তালিকাটি মেমোরিতে রাখা দরকার।
imapআপনি এটিকে পুনরাবৃত্তিযোগ্য তালিকায় পরিণত করেন না এবং এটিকে খণ্ডগুলিতে পরিণত করেন না (ডিফল্টরূপে)। এটি একবারে পুনরাবৃত্তিযোগ্য একটি উপাদানকে পুনরাবৃত্তি করবে এবং সেগুলি প্রতিটি কর্মী প্রক্রিয়ায় প্রেরণ করবে। এর অর্থ আপনি পুরো পুনরাবৃত্তিকে কোনও তালিকায় রূপান্তরিত করার স্মৃতিটিকে আঘাত করেন না, তবে এটির অর্থ হ'ল ছানছানির অভাবে বৃহত পুনরাবৃত্তির জন্য কর্মক্ষমতা ধীর। chunksize1 এর ডিফল্টের চেয়ে বড় আর্গুমেন্ট পাস করার মাধ্যমে এটি প্রশমিত করা যেতে পারে ।
imap/ imap_unorderedএবং map/ এর মধ্যে অন্য প্রধান পার্থক্য map_asyncহ'ল imap/ এর সাথে imap_unordered, আপনি শ্রমিকদের প্রস্তুত হওয়ার সাথে সাথে ফলাফলগুলি পেতে শুরু করতে পারেন, তাদের সকলের সমাপ্তির জন্য অপেক্ষা না করে। এর সাথে সাথে সাথে map_asyncএকটি AsyncResultফিরিয়ে দেওয়া হয়, তবে সেগুলি সমস্ত প্রক্রিয়া না করা পর্যন্ত আপনি প্রকৃতপক্ষে সেই বস্তুটি থেকে ফলাফলগুলি পুনরুদ্ধার করতে পারবেন না, যে বিন্দুতে এটি একই তালিকাটি দেয় যা map( mapআসলে অভ্যন্তরীণভাবে প্রয়োগ করা হয় map_async(...).get())। আংশিক ফলাফল পাওয়ার কোনও উপায় নেই; আপনার হয় হয় পুরো ফলাফল, না কিছুই।
imapএবং imap_unorderedউভয়ই তত্ক্ষণাত পুনরাবৃত্তি ফিরে আসে। এর সাথে imap, ফলাফলগুলি প্রস্তুত হওয়ার সাথে সাথে পুনরাবৃত্তিযোগ্যদের কাছ থেকে ফলাফল পাওয়া যাবে, তবুও ইনপুটটির পুনরাবৃত্তির ক্রম সংরক্ষণ করে। সাথে imap_unordered, ফলাফলগুলি প্রস্তুত হওয়ার সাথে সাথেই ফলন করা হবে, ইনপুটটির পুনরাবৃত্তির ক্রম নির্বিশেষে। সুতরাং, বলুন আপনার কাছে এটি রয়েছে:
import multiprocessing
import time
def func(x):
time.sleep(x)
return x + 2
if __name__ == "__main__":
p = multiprocessing.Pool()
start = time.time()
for x in p.imap(func, [1,5,3]):
print("{} (Time elapsed: {}s)".format(x, int(time.time() - start)))
এটি আউটপুট দেবে:
3 (Time elapsed: 1s)
7 (Time elapsed: 5s)
5 (Time elapsed: 5s)
আপনি যদি এর p.imap_unorderedপরিবর্তে ব্যবহার করেন তবে আপনি p.imapদেখতে পাবেন:
3 (Time elapsed: 1s)
5 (Time elapsed: 3s)
7 (Time elapsed: 5s)
আপনি যদি ব্যবহার করেন p.mapবা p.map_async().get(), আপনি দেখতে পাবেন:
3 (Time elapsed: 5s)
7 (Time elapsed: 5s)
5 (Time elapsed: 5s)
সুতরাং, ব্যবহার imap/ imap_unorderedবেশি করার প্রাথমিক কারণগুলি হ'ল map_async:
- আপনার পুনরাবৃত্তীয় যথেষ্ট বড় যে এটিকে একটি তালিকায় রূপান্তর করা আপনাকে অত্যধিক মেমরি ব্যবহারের বাইরে চলে যাওয়ার কারণ হতে পারে।
- আপনি ফলাফল প্রক্রিয়াকরণের শুরু করার আগে সক্ষম হতে চান সব তাদের সম্পন্ন হবে।