মাল্টিপ্রসেসিং.পুল: মানচিত্র_অ্যাসেন্স এবং ইম্যাপের মধ্যে পার্থক্য কী?


182

আমি পাইথনের multiprocessingপ্যাকেজটি কীভাবে ব্যবহার করতে হয় তা শেখার চেষ্টা করছি , কিন্তু আমি map_asyncএবং এর মধ্যে পার্থক্য বুঝতে পারি না imap। আমি লক্ষ্য করেছি যে উভয়ই map_asyncএবং imapঅ্যাসিক্রোনালিকভাবে মৃত্যুদন্ড কার্যকর করা হয়। সুতরাং আমি যখন অন্য এক ব্যবহার করা উচিত? এবং আমি কীভাবে ফিরে আসা ফলাফল পুনরুদ্ধার করব map_async?

আমার কি এমন কিছু ব্যবহার করা উচিত?

def test():
    result = pool.map_async()
    pool.close()
    pool.join()
    return result.get()

result=test()
for i in result:
    print i

উত্তর:


490

imap/ imap_unorderedএবং map/ এর মধ্যে দুটি মূল পার্থক্য রয়েছে map_async:

  1. তারা যেভাবে পুনরাবৃত্তিযোগ্য তাদের গ্রাস করে।
  2. যেভাবে তারা আপনাকে ফলাফল ফিরিয়ে দেয়।

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:

  1. আপনার পুনরাবৃত্তীয় যথেষ্ট বড় যে এটিকে একটি তালিকায় রূপান্তর করা আপনাকে অত্যধিক মেমরি ব্যবহারের বাইরে চলে যাওয়ার কারণ হতে পারে।
  2. আপনি ফলাফল প্রক্রিয়াকরণের শুরু করার আগে সক্ষম হতে চান সব তাদের সম্পন্ন হবে।

1
প্রয়োগ ও প্রয়োগ_স্যাসিক সম্পর্কে কী?
হর্ষ দাফটারি

10
@ হার্শডাফারি applyএকটি কর্মী প্রক্রিয়ায় একটি কাজ পাঠিয়ে দেয় এবং তারপরে এটি শেষ না হওয়া অবরুদ্ধ হয়। apply_asyncএকটি কাজের প্রক্রিয়াতে একটি কাজকে প্রেরণ করে এবং তারপরে তত্ক্ষণাত কোনও AsyncResultবস্তু ফেরত দেয় , যা কার্য শেষ হওয়ার জন্য এবং ফলাফলটি পুনরুদ্ধারের জন্য অপেক্ষা করতে ব্যবহৃত হতে পারে। applyকেবল কল করে বাস্তবায়িত হয়apply_async(...).get()
Dano

51
এটি সেই ধরণের বিবরণ যা বিদ্যমান নিস্তেজ বর্ণনার Poolচেয়ে অফিসিয়াল ডকুমেন্টেশনে থাকা উচিত ।
মিনিট

@ এডানো আমি ব্যাকগ্রাউন্ডে একটি ফাংশন চালাতে চাই তবে আমার কিছু রিসোর্স সীমাবদ্ধতা রয়েছে এবং আমি যতবার ইচ্ছা ফাংশনটি চালাতে পারি না এবং ফাংশনের অতিরিক্ত মৃত্যুদণ্ডের সারি সারি করতে চাই। আমার কীভাবে তা করা উচিত সে সম্পর্কে আপনার কোনও ধারণা আছে? আমি এখানে আমার প্রশ্ন আছে । আপনি কি দয়া করে আমার প্রশ্নটি একবার দেখে নিতে পারেন এবং দেখুন যে আমাকে কীভাবে করা উচিত সে সম্পর্কে আপনি আমাকে কিছু ইঙ্গিত (বা আরও ভাল, একটি উত্তর) দিতে পারেন কিনা?
আমির

1
@ বালপয়েন্টপেন এটি শেষ হওয়ার সাথে সাথে এটি পরবর্তী অংশে চলে যাবে। অর্ডারিং প্যারেন্ট প্রক্রিয়াতে ফিরে পরিচালিত হয়।
ড্যানো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.