0

我有一个包含 100 行文本的文件。

paulk@node013:test_parallel$ for i in {1..100}; do echo "trash" >> infile.txt; done

我想要几个进程并行读取这个文件。

#!/usr/bin/env python
import multiprocessing

def f( in_file, out_file ):
    for row in in_file:
        print >> out_file, row.strip()

#   out_file.seek( 0 ) # interesting line
    return

f1 = open( 'infile.txt' )
f2 = open( 'infile.txt' )

g1 = open( 'outfile1.txt', 'w' )
g2 = open( 'outfile2.txt', 'w' )

p1 = multiprocessing.Process( target=f, args=( f1, g1, ) )
p1.start()

p2 = multiprocessing.Process( target=f, args=( f2, g2, ) )
p2.start()

p1.join()
p2.join()

f1.close()
f2.close()

g1.close()
g2.close()

如果没有标记为“有趣”的行,则不会将任何内容写入输出文件:

paulk@node013:test_parallel$ wc -l *file*.txt
100 infile.txt
  0 outfile1.txt
  0 outfile2.txt
100 total

包括它的工作原理:

paulk@node013:test_parallel$ wc -l *file*.txt
 100 infile.txt
 100 outfile1.txt
 100 outfile2.txt
 300 total

有人可以解释为什么该seek()方法有效吗?难道是它隐式调用“正确”方法以确保将数据写入文件?我很困惑。

我正在使用 Python 2.7。

谢谢。

保罗

4

1 回答 1

4

您正在将打开的文件对象传递给另一个进程。我不喜欢这个;它似乎不是很干净。我更愿意将文件名传递给子进程,子进程将打开文件,写入文件,然后关闭它。这会很干净。

我猜当子进程写入文件对象时,它会进行一些内部缓存。显然子进程没有关闭文件,并且没有刷新缓存就结束了。该out_file.seek(0)语句具有刷新缓存的副作用。您可能可以使用out_file.flush().

但实际上,只需将文件名传递给子进程。否则,无论您实现什么,操作系统和 Python 版本都会有所不同。

于 2013-08-14T08:46:18.707 回答