如何使用多处理在不同的子进程中聚合结果

时间:2017-08-29 09:01:29

标签: python multiprocessing pool

这是我尝试执行多个过程的测试代码:

In [157]: imgs = np.random.randint(0,255,(10,48,48,1)) # input

In [158]: z = np.zeros(imgs.shape[:-1] + (2,), dtype=imgs.dtype)

In [159]: np.concatenate((imgs, z), axis=-1).shape
Out[159]: (10, 48, 48, 3)

在每个子流程中,我可以在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()。但问题是如何将这些段聚合成一个实体[0,1,...,10]来打印?

任何想法都会有所帮助。

2 个答案:

答案 0 :(得分:0)

每个流程都有自己的a列表副本,因此他们不会追加到同一个对象,而您的主流程也无法获得结果。 您需要使用multiprocessing.Queue并将结果排入队列。 然后,您的主进程可以将结果出列并根据需要进行处理。

答案 1 :(得分:0)

您正在关注的是流程之间的沟通。您可以使用此处的文档中描述的队列:

https://pymotw.com/2/multiprocessing/communication.html