与多进程并行读取数据
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并发编程原理与实战三:多线程与多进程的联系以及上下文切换所导致资源浪费问题