pol*_*ise 0 python parallel-processing
我有一个包含100行文本的文件.
paulk@node013:test_parallel$ for i in {1..100}; do echo "trash" >> infile.txt; done
Run Code Online (Sandbox Code Playgroud)
我想要几个进程并行读取此文件.
#!/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()
Run Code Online (Sandbox Code Playgroud)
如果没有标记为"有趣"的行,则不会将任何内容写入输出文件:
paulk@node013:test_parallel$ wc -l *file*.txt
100 infile.txt
0 outfile1.txt
0 outfile2.txt
100 total
Run Code Online (Sandbox Code Playgroud)
包括它的工作原理:
paulk@node013:test_parallel$ wc -l *file*.txt
100 infile.txt
100 outfile1.txt
100 outfile2.txt
300 total
Run Code Online (Sandbox Code Playgroud)
有人可以请说明该seek()方法的工作原理吗?难道它隐含地调用'正确'方法来确保将数据写入文件?我糊涂了.
我正在使用Python 2.7.
谢谢.
保罗
您正在将打开的文件对象传递给另一个进程.我不喜欢这个; 它看起来不太干净.我更喜欢将文件名传递给子进程,子进程将打开文件,写入文件并关闭它.这很干净.
我想当子进程写入文件对象时,它会进行一些内部缓存.显然,子进程不会关闭文件,并且在不刷新缓存的情况下结束.该out_file.seek(0)语句具有刷新缓存的副作用.你可以实现同样的目标out_file.flush().
但实际上,只需将文件名传递给子进程即可.否则,您实现的任何操作系统和Python版本之间都会有所不同.
| 归档时间: |
|
| 查看次数: |
345 次 |
| 最近记录: |