Bazı nedenlerden dolayı, bunun Queue
herhangi 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
Queue
alt 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.join
Process
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.Queue
değil, yerine kullanmanızı tavsiye ederimManager
. KullanmakManager
için tamamen yeni bir süreç ortaya çıkarQueue
.