ভেবেছি আমি উপরে থেকে অনুলিপি করা সহজ উদাহরণগুলি সহজ করে তুলব, আমার জন্য পাই 3.6 এ কাজ করে। সবচেয়ে সহজ multiprocessing.Pool
:
import multiprocessing
import time
def worker(x):
time.sleep(1)
return x
pool = multiprocessing.Pool()
print(pool.map(worker, range(10)))
আপনি পুলটিতে প্রক্রিয়াগুলির সংখ্যা নির্ধারণ করতে পারেন, উদাহরণস্বরূপ Pool(processes=5)
,। তবে এটি সিপিইউ গণনায় ডিফল্ট, সুতরাং এটি সিপিইউ-বাউন্ড কাজের জন্য ফাঁকা রাখুন। (ইনপুট / আউটপুট-বাউন্ড কর্ম প্রায়ই মামলা থ্রেড যাহাই হউক না কেন, থ্রেড বেশিরভাগই তাই অপেক্ষা করছে একটি CPU- র কোর ভাগ করে নিতে পারেন।) Pool
এছাড়াও প্রযোজ্য অপ্টিমাইজেশান কদর্য ।
(দ্রষ্টব্য যে কোনও পদ্ধতির মধ্যে কর্মী পদ্ধতিতে বাসা বেঁধে দেওয়া যায় না I আমি প্রথমে আমার কর্মী পদ্ধতিটিকে কলটি করে এমন পদ্ধতির অভ্যন্তরে সংজ্ঞায়িত করেছি pool.map
, যাতে এটি সমস্ত স্বাবলম্বিত হয়, তবে প্রক্রিয়াগুলি এটিকে আমদানি করতে পারেনি এবং "এট্রিবিউটআরার" ছুঁড়ে ফেলেছে) : স্থানীয় অবজেক্টকে আউটআর_মোথাল..আনার_মোথডো আচার দেওয়া যায় না "আরও এখানে । এটি কোনও শ্রেণীর অভ্যন্তরে থাকতে পারে))
(এর 'represent!'
পরিবর্তে মূল প্রশ্নটি নির্দিষ্ট করা মুদ্রণের প্রশংসা করুন time.sleep()
, তবে এটি না করেই আমি ভেবেছিলাম কিছু কোড একযোগে চলছিল না যখন তা ছিল না))
পাই 3 এর ProcessPoolExecutor
দুটি লাইনও রয়েছে ( .map
একটি জেনারেটর ফেরত দেয় যাতে আপনার প্রয়োজন হয় list()
):
from concurrent.futures import ProcessPoolExecutor
with ProcessPoolExecutor() as executor:
print(list(executor.map(worker, range(10))))
সরল Process
এস সহ:
import multiprocessing
import time
def worker(x, queue):
time.sleep(1)
queue.put(x)
queue = multiprocessing.SimpleQueue()
tasks = range(10)
for task in tasks:
multiprocessing.Process(target=worker, args=(task, queue,)).start()
for _ in tasks:
print(queue.get())
SimpleQueue
আপনার প্রয়োজনীয় সমস্ত যদি put
এবং হয় তবে ব্যবহার করুন get
। প্রথম লুপটি সমস্ত প্রক্রিয়া শুরু করে, দ্বিতীয়টি ব্লকিং queue.get
কল করার আগে। আমিও কল করার কোনও কারণ নেই বলে মনে করি p.join()
না।
multiprocessing.Queue
না করে একটি ব্যবহার করার পরামর্শ দেবManager
। একটি ব্যবহারেরManager
জন্য সম্পূর্ণ নতুন প্রক্রিয়া তৈরি হওয়া দরকার, যা যখন করা হয় তখন ওভারকিল হয়Queue
।