- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在进行大量计算,并将结果写入文件。使用多处理,我尝试并行计算。
这里的问题是我正在写入一个输出文件,所有工作人员也在写入该文件。我对多重处理还很陌生,想知道如何让它发挥作用。
下面给出了代码的一个非常简单的概念:
from multiprocessing import Pool
fout_=open('test'+'.txt','w')
def f(x):
fout_.write(str(x) + "\n")
if __name__ == '__main__':
p = Pool(5)
p.map(f, [1, 2, 3])
我想要的结果是一个包含以下内容的文件:
1 2 3
但是现在我得到一个空文件。有什么建议么?我非常感谢任何帮助:)!
最佳答案
您不应该让所有工作人员/进程写入单个文件。它们都可以从一个文件中读取(这可能会由于工作人员等待其中一个文件完成读取而导致速度减慢),但写入同一文件将导致冲突和潜在的损坏。
就像评论中所说的那样,改为写入单独的文件,然后将它们合并到一个进程中。这个小程序根据您帖子中的程序进行了说明:
from multiprocessing import Pool
def f(args):
''' Perform computation and write
to separate file for each '''
x = args[0]
fname = args[1]
with open(fname, 'w') as fout:
fout.write(str(x) + "\n")
def fcombine(orig, dest):
''' Combine files with names in
orig into one file named dest '''
with open(dest, 'w') as fout:
for o in orig:
with open(o, 'r') as fin:
for line in fin:
fout.write(line)
if __name__ == '__main__':
# Each sublist is a combination
# of arguments - number and temporary output
# file name
x = range(1,4)
names = ['temp_' + str(y) + '.txt' for y in x]
args = list(zip(x,names))
p = Pool(3)
p.map(f, args)
p.close()
p.join()
fcombine(names, 'final.txt')
它为每个参数组合运行f
,在本例中是 x 的值和临时文件名。它使用参数组合的嵌套列表,因为 pool.map 不接受多个参数。还有其他方法可以解决这个问题,尤其是在较新的 Python 版本上。
对于每个参数组合和池成员,它都会创建一个单独的文件,并将输出写入其中。原则上,您的输出会更长,您可以简单地将另一个计算它的函数添加到 f
函数中。另外,不需要对 3 个参数使用 Pool(5)(尽管我假设只有三个工作线程处于事件状态)。
调用 close()
和 join()
的原因在this中有很好的解释。邮政。事实证明(在链接帖子的评论中) map
正在阻塞,因此在这里您出于最初的原因不需要它们(等到它们全部完成,然后写入合并的输出文件仅来自一个过程)。如果以后添加其他并行功能,我仍然会使用它们。
在最后一步中,fcombine
收集所有临时文件并将其复制到一个文件中。它有点太嵌套了,例如,如果您决定在复制后删除临时文件,您可能需要在 with open('dest', )..
或 for 循环下使用单独的函数下面 - 为了可读性和功能性。
关于python - 在池多处理中写入文件 (Python 2.7),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49347166/
我是一名优秀的程序员,十分优秀!