如何在 Python 中并行化生成器/迭代器的管道?

2023-12-30

假设我有一些如下的 Python 代码:

input = open("input.txt")
x = (process_line(line) for line in input)
y = (process_item(item) for item in x)
z = (generate_output_line(item) + "\n" for item in y)
output = open("output.txt", "w")
output.writelines(z)

此代码从输入文件中读取每一行,通过多个函数运行它,并将输出写入输出文件。现在I知道函数process_line, process_item, and generate_output_line永远不会互相干扰,并且我们假设输入和输出文件位于不同的磁盘上,这样读取和写入就不会互相干扰。

但 Python 可能不知道这些。我的理解是Python将读取一行,依次应用每个函数,并将结果写入输出,然后只读取第二行after将第一行发送到输出,以便在第一行退出之前第二行不会进入管道。我是否正确理解了该程序的流程?如果这就是它的工作原理,是否有任何简单的方法可以使多行可以同时进入管道,以便程序并行读取、写入和处理每个步骤?


您无法真正并行读取或写入文件;最终,这些将成为你的瓶颈。你是sure你这里的瓶颈是CPU,而不是I/O?

由于您的处理不包含依赖项(根据您的说法),因此使用起来非常简单Python的multiprocessing.Pool类 http://docs.python.org/library/multiprocessing.html#module-multiprocessing.pool.

有几种方法可以写这个,但是更容易写。调试是为了找到独立的关键路径(代码中最慢的部分),我们将使其并行运行。我们假设它是 process_item。

……实际上就是这样。代码:

import multiprocessing.Pool

p = multiprocessing.Pool() # use all available CPUs

input = open("input.txt")
x = (process_line(line) for line in input)
y = p.imap(process_item, x)
z = (generate_output_line(item) + "\n" for item in y)
output = open("output.txt", "w")
output.writelines(z)

我还没有测试过,但这是基本思想。 Pool 的 imap 方法确保结果以正确的顺序返回。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Python 中并行化生成器/迭代器的管道? 的相关文章

随机推荐