মাল্টিপ্রসেসিং.পুল: অ্যাপ্লিকেশন, অ্যাপ্লিকেশন_সেনসি বা মানচিত্র কখন ব্যবহার করবেন?


290

পুল.এপ্লি , পুল.অ্যাপ্লি_সেসেন্স এবং পুল.ম্যাপের ক্ষেত্রে ব্যবহারের ক্ষেত্রে সুস্পষ্ট উদাহরণ আমি দেখিনি । আমি প্রধানত ব্যবহার করছি Pool.map; অন্যের সুবিধা কি?

উত্তর:


424

পাইথনের পুরানো দিনগুলিতে, স্বেচ্ছাসেবী যুক্তি সহ একটি ফাংশন কল করার জন্য, আপনি ব্যবহার করবেন apply:

apply(f,args,kwargs)

applyপাইথন 3 তে এখনও পাইথন 2.7 এ নেই এবং সাধারণত এটি আর ব্যবহৃত হয় না। আজকাল,

f(*args,**kwargs)

পছন্দসই multiprocessing.Poolমডিউল একটি অনুরূপ ইন্টারফেসের প্রদান করার চেষ্টা করে।

Pool.applyপাইথনের মতো apply, ফাংশন কলটি পৃথক প্রক্রিয়াতে সঞ্চালিত হয় except Pool.applyফাংশন শেষ না হওয়া অবধি অবরুদ্ধ।

Pool.apply_asyncপাইথনের বিল্ট-ইন-এর মতোই apply, ফলটি অপেক্ষা না করে কলটি তত্ক্ষণাত্ ফিরে আসে। একটি AsyncResultবস্তু ফেরত দেওয়া হয়। আপনি get()ফাংশন কলের ফলাফল পুনরুদ্ধার করার জন্য এর পদ্ধতিটি কল করেন। get()ফাংশন পর্যন্ত পদ্ধতি ব্লক সম্পন্ন হয়। সুতরাং, pool.apply(func, args, kwargs)সমতুল্য pool.apply_async(func, args, kwargs).get()

বিপরীতে Pool.apply, Pool.apply_asyncপদ্ধতিটিতে একটি কলব্যাকও রয়েছে যা সরবরাহ করা থাকলে, ফাংশনটি সম্পূর্ণ হয়ে গেলে ডাকা হয়। এটি কল করার পরিবর্তে ব্যবহার করা যেতে পারে get()

উদাহরণ স্বরূপ:

import multiprocessing as mp
import time

def foo_pool(x):
    time.sleep(2)
    return x*x

result_list = []
def log_result(result):
    # This is called whenever foo_pool(i) returns a result.
    # result_list is modified only by the main process, not the pool workers.
    result_list.append(result)

def apply_async_with_callback():
    pool = mp.Pool()
    for i in range(10):
        pool.apply_async(foo_pool, args = (i, ), callback = log_result)
    pool.close()
    pool.join()
    print(result_list)

if __name__ == '__main__':
    apply_async_with_callback()

যেমন একটি ফল হতে পারে

[1, 0, 4, 9, 25, 16, 49, 36, 81, 64]

লক্ষ্য করুন, বিপরীতে pool.map, ফলাফলের ক্রমটি যে আদেশে pool.apply_asyncকল হয়েছিল তার সাথে সামঞ্জস্য হতে পারে না ।


সুতরাং, আপনি একটি পৃথক প্রক্রিয়ায় একটি ফাংশন চালানোর জন্য, কিন্তু বর্তমান প্রক্রিয়া চান প্রয়োজন ব্লক যে ফাংশন আয়, ব্যবহার না হওয়া পর্যন্ত Pool.apply। মত Pool.apply, Pool.mapসম্পূর্ণ ফলাফল ফিরে না আসা পর্যন্ত অবরুদ্ধ।

আপনি যদি পুলের কর্মী প্রসেসগুলি বহু ফাংশন কলকে অ্যাসিঙ্ক্রোনালি সম্পাদন করতে চান তবে ব্যবহার করুন Pool.apply_asyncঅর্ডার ফলাফল কল ক্রম হিসাবে একই হতে নিশ্চিত করা হয় না Pool.apply_async

এছাড়াও লক্ষ করুন যে আপনি বিভিন্ন ফাংশন দিয়ে Pool.apply_asyncকল করতে পারেন (সমস্ত কল একই ফাংশন ব্যবহার করার প্রয়োজন হয় না)।

বিপরীতে, Pool.mapঅনেক যুক্তি একই ফাংশন প্রয়োগ করে। তবে, বিপরীতে Pool.apply_async, যুক্তিগুলির ক্রম অনুসারে একটি আদেশ প্রদান করা হয়।


11
সেখানে উচিত if __name__=="__main__"সামনে apply_async_with_callback()Windows এ?
jfs

3
অনেক ধন্যবাদ. ম্যাপ_সায়েন্স সম্পর্কে কীভাবে?
Phyo আরকার লুইন

38
মাল্টিপ্রসেসিং / পুল.পিপির ভিতরে দেখুন এবং আপনি দেখতে পাবেন যে Pool.map(func,iterable)এটি সমান Pool.map_async(func,iterable).get()। সুতরাং মধ্যে সম্পর্ক Pool.mapএবং Pool.map_asyncযে অনুরূপ Pool.applyএবং Pool.apply_asyncasyncযখন অ কমান্ড, অবিলম্বে আসতে asyncকমান্ড অবরোধ করুন। asyncকমান্ড এছাড়াও একটি কলব্যাক আছে।
unutbu

7
ব্যবহার মধ্যে মনন Pool.mapএবং Pool.applyযখন না ব্যবহার করার সিদ্ধান্ত নেওয়ার অনুরূপ mapবা applyপাইথন হবে। আপনি কেবল সেই সরঞ্জামটি ব্যবহার করুন যা কাজের উপযুক্ত fits আপনি যদি কলটি বর্তমান প্রক্রিয়াটি ব্লক করতে চান এবং / অথবা আপনি কলব্যাকটি ব্যবহার করতে চান তা নির্ভর করে asyncএবং অ- asyncসংস্করণ ব্যবহারের মধ্যে সিদ্ধান্ত নেওয়া তার উপর নির্ভর করে।
unutbu

6
@ ফলস পকেটস: হ্যাঁ প্রতিটি কল apply_asyncএকটি ApplyResultবস্তু ফেরত দেয় । ApplyResultএর getপদ্ধতিটি কল করার সাথে সম্পর্কিত ফাংশনটির রিটার্ন মান ফিরে আসবে (বা mp.TimeoutErrorকলটি টাইম-আউট হলে উত্থাপন করবে)) সুতরাং আপনি যদি ApplyResultএকটি আদেশযুক্ত তালিকায় রাখেন , তবে তাদের getপদ্ধতিগুলি কল করে একই ক্রমে ফলাফলগুলি ফিরে আসবে। আপনি কেবল pool.mapএই পরিস্থিতিতে ব্যবহার করতে পারেন ।
unutbu

75

সংক্রান্ত applyবনাম map:

pool.apply(f, args): fপুলের কর্মীদের মধ্যে কেবল একটিতে মৃত্যুদন্ড কার্যকর করা হয়। সুতরাং পুলের মধ্যে একটি প্রক্রিয়া চলবে f(args)

pool.map(f, iterable): এই পদ্ধতিটি পৃথক টাস্ক হিসাবে প্রক্রিয়া পুলের কাছে জমা দেয় যা বহুসংখ্যক খণ্ডে পুনরাবৃত্তকারীকে ছাঁটাই করে। সুতরাং আপনি পুলের সমস্ত প্রক্রিয়াটি গ্রহণ করেন।


4
যদি পুনরাবৃত্তিযোগ্য কোনও জেনারেটর হয়
রাস্টি শ্যাকলফোর্ড

হুম ... ভাল প্রশ্ন। : সত্যি বলতে আমি কখনো জেনারেটর দিয়ে পুল ব্যবহার করেছেন, কিন্তু এই থ্রেড হতে পারে সহায়ক stackoverflow.com/questions/5318936/...
kakhkAtion

@kakkAtion প্রয়োগ সম্পর্কে, কেবলমাত্র শ্রমিকদের মধ্যে একটি যদি এই কার্য সম্পাদন করে তবে বাকী শ্রমিকরা কী করবে? বাকী শ্রমিকরা কোনও কাজ সম্পাদনের জন্য আমাকে কি একাধিকবার কল করতে হবে?
মুন্দ্রা

3
সত্য। আপনি যদি অবিচ্ছিন্নভাবে মধ্যাহ্নভোজ কর্মীদের মধ্যাহ্নভোজন করতে চান তবে পুলটি দেখুন.অ্যাপ্লি_অ্যাসেন্সিক। "ফলাফল প্রস্তুত না হওয়া অবধি পুল_অ্যাপলি ব্লকস, সুতরাং প্রয়োগ_সেসক () সমান্তরালভাবে কাজ সম্পাদনের জন্য আরও উপযুক্ত"
কাখ্যাকশন

1
আমার 4 টি প্রক্রিয়া থাকলেও apply_async()8 বার কল করলে কী হয় ? এটি কি স্বয়ংক্রিয়ভাবে এটি একটি সারি দিয়ে পরিচালনা করবে?
সরবনবালাগী রামচন্দ্রন

31

এখানে অর্ডার মধ্যে পার্থক্য প্রদর্শন করার জন্য একটি টেবিল বিন্যাসে একটি ওভারভিউ Pool.apply, Pool.apply_async, Pool.mapএবং Pool.map_async। কোনওটি চয়ন করার সময়, আপনাকে একাধিক-আরগস, সম্মতি, অবরুদ্ধকরণ এবং অ্যাকাউন্টে ক্রম নিতে হবে:

                  | Multi-args   Concurrence    Blocking     Ordered-results
---------------------------------------------------------------------
Pool.map          | no           yes            yes          yes
Pool.map_async    | no           yes            no           yes
Pool.apply        | yes          no             yes          no
Pool.apply_async  | yes          yes            no           no
Pool.starmap      | yes          yes            yes          yes
Pool.starmap_async| yes          yes            no           no

মন্তব্য:

  • Pool.imapএবং Pool.imap_async- মানচিত্রের অলস সংস্করণ এবং মানচিত্র_অ্যাসিঙ্ক।

  • Pool.starmap একাধিক যুক্তি স্বীকৃতি ছাড়াও মানচিত্রের পদ্ধতির সাথে অনেকটা মিল।

  • Asyncপদ্ধতিগুলি সমস্ত প্রক্রিয়া একবারে জমা দেয় এবং ফলাফলগুলি শেষ হয়ে গেলে পুনরুদ্ধার করে। ফলাফল প্রাপ্ত করতে get পদ্ধতি ব্যবহার করুন।

  • Pool.map(বা Pool.apply) পাইথন অন্তর্নির্মিত মানচিত্রের (বা প্রয়োগ) সাথে অনেকগুলি মিল। সমস্ত প্রক্রিয়া শেষ না হওয়া পর্যন্ত এবং ফলাফলটি না ফেরানো পর্যন্ত তারা মূল প্রক্রিয়াটিকে অবরুদ্ধ করে।

উদাহরণ:

মানচিত্র

এক সময়ের মধ্যে কাজের তালিকার জন্য বলা হয়

results = pool.map(func, [1, 2, 3])

প্রয়োগ করা

শুধুমাত্র একটি কাজের জন্য বলা যেতে পারে

for x, y in [[1, 1], [2, 2]]:
    results.append(pool.apply(func, (x, y)))

def collect_result(result):
    results.append(result)

map_async

এক সময়ের মধ্যে কাজের তালিকার জন্য বলা হয়

pool.map_async(func, jobs, callback=collect_result)

apply_async

কেবলমাত্র একটি কাজের জন্য ডাকা যেতে পারে এবং সমান্তরালে পটভূমিতে একটি কাজ চালায়

for x, y in [[1, 1], [2, 2]]:
    pool.apply_async(worker, (x, y), callback=collect_result)

starmap

এক রূপ pool.mapযা একাধিক যুক্তি সমর্থন করে

pool.starmap(func, [(1, 1), (2, 1), (3, 1)])

starmap_async

স্টারম্যাপ () এবং ম্যাপ_সেসিঙ্ক () এর সংমিশ্রণ যা পুনরাবৃত্তের পুনরাবৃত্তির উপরে পুনরাবৃত্তি করে এবং আনপ্যাকডযুক্ত পুনরাবৃত্তির সাথে ফানকে কল করে। ফলাফল অবজেক্ট ফেরত দেয়।

pool.starmap_async(calculate_worker, [(1, 1), (2, 1), (3, 1)], callback=collect_result)

রেফারেন্স:

এখানে সম্পূর্ণ ডকুমেন্টেশন সন্ধান করুন: https://docs.python.org/3/library/m মাল্টিপ্রোসেসিং html


2
পুল.স্টারম্যাপ () ব্লক করছে
অ্যালান ইভানজিস্টিস্ট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.