如何使用多处理在不同的子进程中聚合结果
how to aggregate the result in different subprocess with multiprocessing
这是我尝试执行多进程的测试代码:
from multiprocessing import Process, Pool, Queue
a = []
def long_time_task(name):
print 'run task %s (%s)' % (name,os.getpid())
start = time.time()
time.sleep(random.random() * 3)
end = time.time()
a.append(name)
print a
if __name__ == '__main__' :
print 'parent process %s' % os.getpid()
p = Pool(5)
for i in range(10):
p.apply_async(long_time_task,args = (i,))
print 'waiting for all subprocess done'
print a
p.close()
p.join()
print 'all subprocesses done'
在每个子流程中,我可以在 p.join()
之后的末尾打印不同的段,例如 [4, 7],[2],[1, 6],[3, 5],[0, 8, 9]
。但问题是如何将这些段聚合成一个实体 [0,1,...,10] 来打印?
任何想法都会有所帮助。
每个进程都有自己的 a
列表副本,因此它们不会附加到同一个对象,您的主进程也不会获得结果。
您需要使用 multiprocessing.Queue
并将您的结果排在那里。
然后,您的主进程可以将结果出列并根据需要进行处理。
你看到的是进程间的通信。您可以使用此处文档中描述的队列:
这是我尝试执行多进程的测试代码:
from multiprocessing import Process, Pool, Queue
a = []
def long_time_task(name):
print 'run task %s (%s)' % (name,os.getpid())
start = time.time()
time.sleep(random.random() * 3)
end = time.time()
a.append(name)
print a
if __name__ == '__main__' :
print 'parent process %s' % os.getpid()
p = Pool(5)
for i in range(10):
p.apply_async(long_time_task,args = (i,))
print 'waiting for all subprocess done'
print a
p.close()
p.join()
print 'all subprocesses done'
在每个子流程中,我可以在 p.join()
之后的末尾打印不同的段,例如 [4, 7],[2],[1, 6],[3, 5],[0, 8, 9]
。但问题是如何将这些段聚合成一个实体 [0,1,...,10] 来打印?
任何想法都会有所帮助。
每个进程都有自己的 a
列表副本,因此它们不会附加到同一个对象,您的主进程也不会获得结果。
您需要使用 multiprocessing.Queue
并将您的结果排在那里。
然后,您的主进程可以将结果出列并根据需要进行处理。
你看到的是进程间的通信。您可以使用此处文档中描述的队列: