Bazı nedenlerden dolayı, bunun Queueherhangi bir yerde nasıl yapılacağına dair genel bir örnek bulamadım (Python'un doktor örnekleri bile birden fazla işlem üretmiyor), bu yüzden 10 denemeden sonra çalıştığım şey:
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
Queuealt işlemlerden döndürülen değerleri depolamak için kullanabileceğiniz engelleme, iş parçacığı açısından güvenli bir kuyruktur. Bu yüzden kuyruğu her bir işleme geçirmek zorundasınız. Burada az belirgin şey yapmak zorunda olduğunu get()senden önce kuyruktan es ya da başka kuyruk doldurur ve bloklar her şeyi.joinProcess
Nesneye yönelik olanlar için güncelleme (Python 3.4'te test edilmiştir):
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.Queuedeğil, yerine kullanmanızı tavsiye ederimManager. KullanmakManageriçin tamamen yeni bir süreç ortaya çıkarQueue.