imap
/ imap_unordered
এবং map
/ এর মধ্যে দুটি মূল পার্থক্য রয়েছে map_async
:
- তারা যেভাবে পুনরাবৃত্তিযোগ্য তাদের গ্রাস করে।
- যেভাবে তারা আপনাকে ফলাফল ফিরিয়ে দেয়।
map
পুনরাবৃত্তিকে তালিকায় রূপান্তর করে আপনার পুনরাবৃত্তিকে গ্রাস করে (ধরে নিলেন এটি ইতিমধ্যে কোনও তালিকা নয়), এটিকে ভাঙা ভাঙা করে এবং সেই অংশগুলিকে কর্মী প্রসেসগুলিতে প্রেরণে প্রেরণ করে Pool
। খণ্ডগুলিতে পুনরাবৃত্তি ভাঙ্গা প্রতিটি আইটেম একবারে এক আইটেম প্রসেসের মধ্যে পুনরাবৃত্তীয় মধ্যে উত্তীর্ণ সঞ্চালন করে - বিশেষত যদি পুনরাবৃত্তিযোগ্য বড় হয়। যাইহোক, পুনরাবৃত্তিকে তালিকায় পরিণত করার জন্য এটি খুব বেশি মেমরির ব্যয় করতে পারে, কারণ পুরো তালিকাটি মেমোরিতে রাখা দরকার।
imap
আপনি এটিকে পুনরাবৃত্তিযোগ্য তালিকায় পরিণত করেন না এবং এটিকে খণ্ডগুলিতে পরিণত করেন না (ডিফল্টরূপে)। এটি একবারে পুনরাবৃত্তিযোগ্য একটি উপাদানকে পুনরাবৃত্তি করবে এবং সেগুলি প্রতিটি কর্মী প্রক্রিয়ায় প্রেরণ করবে। এর অর্থ আপনি পুরো পুনরাবৃত্তিকে কোনও তালিকায় রূপান্তরিত করার স্মৃতিটিকে আঘাত করেন না, তবে এটির অর্থ হ'ল ছানছানির অভাবে বৃহত পুনরাবৃত্তির জন্য কর্মক্ষমতা ধীর। chunksize
1 এর ডিফল্টের চেয়ে বড় আর্গুমেন্ট পাস করার মাধ্যমে এটি প্রশমিত করা যেতে পারে ।
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
:
- আপনার পুনরাবৃত্তীয় যথেষ্ট বড় যে এটিকে একটি তালিকায় রূপান্তর করা আপনাকে অত্যধিক মেমরি ব্যবহারের বাইরে চলে যাওয়ার কারণ হতে পারে।
- আপনি ফলাফল প্রক্রিয়াকরণের শুরু করার আগে সক্ষম হতে চান সব তাদের সম্পন্ন হবে।