与多进程并行读取数据

Posted

技术标签:

【中文标题】与多进程并行读取数据【英文标题】:Reading data in parallel with multiprocess 【发布时间】:2016-07-14 15:28:35 【问题描述】:

这可以吗?

我的想法如下:

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

这可以通过多处理来完成吗?有什么限制吗?

谢谢!

【问题讨论】:

是的,这可以做到。除非您使用合适的互斥锁来确保您的字典在不同的读取中保持一致,否则这是一个坏主意,但如果您想要的只是一堆进程更新共享内存中的某些内容,那么任何主流语言都可以为您做到这一点。跨度> 我只想读入大量数据。 dict 中已有的任何数据都不会被编辑或删除。 【参考方案1】:

如果您只想在子进程中读取数据并且每个子进程将添加单个键值对,您可以使用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

【讨论】:

对我来说就是这样。非常感谢!【参考方案2】:

Yes, Python supports multiprocessing.

由于您打算为每个“进程”使用相同的 dict,但是我建议使用 multi-threading 而不是多处理。这允许每个线程使用相同的字典,而不必将不同进程的数据发送到父字典中。

显然,如果您的输入方法依赖于用户或来自标准输入,您就会遇到问题。但是,如果您从文件中获取输入,它应该可以正常工作。

我建议this 博客帮助您使用线程池。它还(在某种程度上)解释了 multiprocessing.dummy 的使用,文档没有。

【讨论】:

@GáborErdős 请注意,由于 CPython 中的全局解释器锁定,您可能会遇到不使用多线程的建议,这使得一次只能运行一个线程。这不应该让您气馁——只有 CPU 密集型计算会真正受到此影响。对于 I/O 绑定的进程,例如读取某些内容,GIL 不起作用,multithreading 很好用。【参考方案3】:

在使用多处理的情况下,条目需要传播到“父进程字典”,但有一个解决方案:

由于那个叫 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,))

有很多以前的艺术,比如:

Python multiprocessing: How do I share a dict among multiple processes?

share dict between processes

python multiprocess update dictionary synchronously

Python sharing a dictionary between parallel processes

【讨论】:

以上是关于与多进程并行读取数据的主要内容,如果未能解决你的问题,请参考以下文章

Java并发编程原理与实战三:多线程与多进程的联系以及上下文切换所导致资源浪费问题

11.python并发入门(part1 初识进程与线程,并发,并行,同步,异步)

数据库并行读取和写入(Python实现)

Python多线程与多进程

Java 进程与多线程

多进程 MPI 与多线程 std::thread 性能