与多进程并行读取数据

时间:2016-07-14 15:28:35

标签: python multiprocessing

可以这样做吗?

我的想法如下:

我会有一个dict,每个子进程都会添加一个新的键:值组合到dict。

这可以通过多处理完成吗?有没有限制?

谢谢!

3 个答案:

答案 0 :(得分:2)

如果您只想读取子流程中的数据,并且每个孩子都会添加单个键值对,则可以使用Pool

import multiprocessing

def worker(x):
    return x, x ** 2

if __name__ == '__main__':
    multiprocessing.freeze_support()

    pool = multiprocessing.Pool(multiprocessing.cpu_count())
    d = dict(pool.map(worker, xrange(10)))
    print d

输出:

{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}

答案 1 :(得分:1)

Yes, Python supports multiprocessing

因为你打算为每个“进程”使用相同的dict,我建议multi-threading而不是多处理。这允许每个线程使用相同的dict,而不必混淆将来自不同进程的数据发送到父级的dict中。

显然,如果您的输入方法取决于用户或来自stdin,那么您将遇到问题。但是如果你从文件中获取输入,它应该可以正常工作。

我建议this博客帮助您使用线程池。它还(有些)解释了multiprocessing.dummy的使用,而docs则没有这样做。

答案 2 :(得分:1)

如果您使用多处理,则需要将条目传播到“父进程字典”,但有一个解决方案:

使用多处理是有帮助的,因为那个人称为GIL ...所以是的,我确实没有考虑使用它,因为它正在充分利用核心。但我使用经理。像:

a_manager = multiprocessing.Manager

然后我用作共享结构:

shared_map = a_manager.dict()

并且在启动流程工作者的调用中:

worker_seq = []
for n in range(multiprocessing.cpu_count()):
    worker_seq.append(multiprocessing.Process(target=my_work_function, args=(shared_map,))

以前的艺术很像: