किसी कारण से, मुझे यह देखने का एक सामान्य उदाहरण नहीं मिला कि इसे Queueकहीं भी कैसे किया जाए (यहां तक कि पायथन के डॉक उदाहरण भी कई प्रक्रियाओं को स्पॉन नहीं करते हैं), इसलिए यहां 10 कोशिशों के बाद मुझे क्या काम मिला:
def add_helper(queue, arg1, arg2): # the func called in child processes
ret = arg1 + arg2
queue.put(ret)
def multi_add(): # spawns child processes
q = Queue()
processes = []
rets = []
for _ in range(0, 100):
p = Process(target=add_helper, args=(q, 1, 2))
processes.append(p)
p.start()
for p in processes:
ret = q.get() # will block
rets.append(ret)
for p in processes:
p.join()
return rets
Queueएक ब्लॉकिंग, थ्रेड-सेफ कतार है जिसका उपयोग आप चाइल्ड प्रोसेस से रिटर्न वैल्यू को स्टोर करने के लिए कर सकते हैं। इसलिए आपको प्रत्येक प्रक्रिया के लिए कतार से गुजरना होगा। यहाँ कुछ कम स्पष्ट है कि आपको get()कतार से पहले joinही Processes है वरना कतार भर जाती है और सब कुछ ब्लॉक कर देती है।
ऑब्जेक्ट-ओरिएंटेड (पायथन 3.4 में परीक्षण) के लिए अपडेट करें :
from multiprocessing import Process, Queue
class Multiprocessor():
def __init__(self):
self.processes = []
self.queue = Queue()
@staticmethod
def _wrapper(func, queue, args, kwargs):
ret = func(*args, **kwargs)
queue.put(ret)
def run(self, func, *args, **kwargs):
args2 = [func, self.queue, args, kwargs]
p = Process(target=self._wrapper, args=args2)
self.processes.append(p)
p.start()
def wait(self):
rets = []
for p in self.processes:
ret = self.queue.get()
rets.append(ret)
for p in self.processes:
p.join()
return rets
# tester
if __name__ == "__main__":
mp = Multiprocessor()
num_proc = 64
for _ in range(num_proc): # queue up multiple tasks running `sum`
mp.run(sum, [1, 2, 3, 4, 5])
ret = mp.wait() # get all results
print(ret)
assert len(ret) == num_proc and all(r == 15 for r in ret)
multiprocessing.Queueबजाय एक का उपयोग करने की सलाह दूंगाManager। एक का उपयोग करते हुएManagerएक पूरी तरह से नई प्रक्रिया है, जो overkill है जब एक को उत्पन्न करने की आवश्यकता हैQueueकरना होगा।