পুল.এপ্লি , পুল.অ্যাপ্লি_সেসেন্স এবং পুল.ম্যাপের ক্ষেত্রে ব্যবহারের ক্ষেত্রে সুস্পষ্ট উদাহরণ আমি দেখিনি । আমি প্রধানত ব্যবহার করছি Pool.map; অন্যের সুবিধা কি?
পুল.এপ্লি , পুল.অ্যাপ্লি_সেসেন্স এবং পুল.ম্যাপের ক্ষেত্রে ব্যবহারের ক্ষেত্রে সুস্পষ্ট উদাহরণ আমি দেখিনি । আমি প্রধানত ব্যবহার করছি Pool.map; অন্যের সুবিধা কি?
উত্তর:
পাইথনের পুরানো দিনগুলিতে, স্বেচ্ছাসেবী যুক্তি সহ একটি ফাংশন কল করার জন্য, আপনি ব্যবহার করবেন 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, যুক্তিগুলির ক্রম অনুসারে একটি আদেশ প্রদান করা হয়।
Pool.map(func,iterable)এটি সমান Pool.map_async(func,iterable).get()। সুতরাং মধ্যে সম্পর্ক Pool.mapএবং Pool.map_asyncযে অনুরূপ Pool.applyএবং Pool.apply_async। asyncযখন অ কমান্ড, অবিলম্বে আসতে asyncকমান্ড অবরোধ করুন। asyncকমান্ড এছাড়াও একটি কলব্যাক আছে।
Pool.mapএবং Pool.applyযখন না ব্যবহার করার সিদ্ধান্ত নেওয়ার অনুরূপ mapবা applyপাইথন হবে। আপনি কেবল সেই সরঞ্জামটি ব্যবহার করুন যা কাজের উপযুক্ত fits আপনি যদি কলটি বর্তমান প্রক্রিয়াটি ব্লক করতে চান এবং / অথবা আপনি কলব্যাকটি ব্যবহার করতে চান তা নির্ভর করে asyncএবং অ- asyncসংস্করণ ব্যবহারের মধ্যে সিদ্ধান্ত নেওয়া তার উপর নির্ভর করে।
apply_asyncএকটি ApplyResultবস্তু ফেরত দেয় । ApplyResultএর getপদ্ধতিটি কল করার সাথে সম্পর্কিত ফাংশনটির রিটার্ন মান ফিরে আসবে (বা mp.TimeoutErrorকলটি টাইম-আউট হলে উত্থাপন করবে)) সুতরাং আপনি যদি ApplyResultএকটি আদেশযুক্ত তালিকায় রাখেন , তবে তাদের getপদ্ধতিগুলি কল করে একই ক্রমে ফলাফলগুলি ফিরে আসবে। আপনি কেবল pool.mapএই পরিস্থিতিতে ব্যবহার করতে পারেন ।
সংক্রান্ত applyবনাম map:
pool.apply(f, args): fপুলের কর্মীদের মধ্যে কেবল একটিতে মৃত্যুদন্ড কার্যকর করা হয়। সুতরাং পুলের মধ্যে একটি প্রক্রিয়া চলবে f(args)।
pool.map(f, iterable): এই পদ্ধতিটি পৃথক টাস্ক হিসাবে প্রক্রিয়া পুলের কাছে জমা দেয় যা বহুসংখ্যক খণ্ডে পুনরাবৃত্তকারীকে ছাঁটাই করে। সুতরাং আপনি পুলের সমস্ত প্রক্রিয়াটি গ্রহণ করেন।
apply_async()8 বার কল করলে কী হয় ? এটি কি স্বয়ংক্রিয়ভাবে এটি একটি সারি দিয়ে পরিচালনা করবে?
এখানে অর্ডার মধ্যে পার্থক্য প্রদর্শন করার জন্য একটি টেবিল বিন্যাসে একটি ওভারভিউ 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)
এক সময়ের মধ্যে কাজের তালিকার জন্য বলা হয়
pool.map_async(func, jobs, callback=collect_result)
কেবলমাত্র একটি কাজের জন্য ডাকা যেতে পারে এবং সমান্তরালে পটভূমিতে একটি কাজ চালায়
for x, y in [[1, 1], [2, 2]]:
pool.apply_async(worker, (x, y), callback=collect_result)
এক রূপ pool.mapযা একাধিক যুক্তি সমর্থন করে
pool.starmap(func, [(1, 1), (2, 1), (3, 1)])
স্টারম্যাপ () এবং ম্যাপ_সেসিঙ্ক () এর সংমিশ্রণ যা পুনরাবৃত্তের পুনরাবৃত্তির উপরে পুনরাবৃত্তি করে এবং আনপ্যাকডযুক্ত পুনরাবৃত্তির সাথে ফানকে কল করে। ফলাফল অবজেক্ট ফেরত দেয়।
pool.starmap_async(calculate_worker, [(1, 1), (2, 1), (3, 1)], callback=collect_result)
এখানে সম্পূর্ণ ডকুমেন্টেশন সন্ধান করুন: https://docs.python.org/3/library/m মাল্টিপ্রোসেসিং html
if __name__=="__main__"সামনেapply_async_with_callback()Windows এ?