Vì một số lý do, tôi không thể tìm thấy một ví dụ chung về cách thực hiện việc này với Queue
bất kỳ nơi nào (ngay cả các ví dụ tài liệu của Python không sinh ra nhiều quy trình), vì vậy đây là những gì tôi đã làm việc sau 10 lần thử:
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
là một hàng đợi chặn, an toàn luồng mà bạn có thể sử dụng để lưu trữ các giá trị trả về từ các tiến trình con. Vì vậy, bạn phải vượt qua hàng đợi cho mỗi quá trình. Một cái gì đó ít rõ ràng ở đây là bạn phải get()
từ hàng đợi trước khi bạn join
sự Process
es hoặc khác hàng đợi đầy và khối tất cả mọi thứ.
Cập nhật cho những người hướng đối tượng (được thử nghiệm trong Python 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
, chứ không phải làManager
ở đây. Sử dụng mộtManager
yêu cầu sinh ra một quy trình hoàn toàn mới, đó là quá mức cần thiết khiQueue
làm.