2013-08-14 2 views
0

파일이 100 줄입니다.Python Multiprocessing : Strange Behavior 단일 파일을 병렬로 읽는 중

[email protected]: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() 

표시된 '재미'아무것도 출력 파일에 기록되지 않은 :

[email protected]:test_parallel$ wc -l *file*.txt 
100 infile.txt 
    0 outfile1.txt 
    0 outfile2.txt 
100 total 

포함 작동 :

[email protected]:test_parallel$ wc -l *file*.txt 
100 infile.txt 
100 outfile1.txt 
100 outfile2.txt 
300 total 

사람은 왜 seek()을에 대한 설명을 제공시겠습니까 방법은 작동합니까? 데이터가 파일에 기록되는지 확인하기 위해 암시 적으로 '올바른'방법을 호출 할 수 있습니까? 나는 혼란스러워.

저는 파이썬 2.7을 사용하고 있습니다.

감사합니다.

답변

5

열려있는 파일 개체를 다른 프로세스로 전달 중입니다. 나는 이것을 좋아하지 않는다. 그것은 매우 깨끗해 보이지 않습니다. 자식 프로세스에 파일 이름을 전달하는 것이 좋을 것입니다. 그리고 자식 프로세스는 파일을 열고, 그것에 쓰고, 닫을 것입니다. 이것은 깨끗합니다.

자식 프로세스가 파일 객체에 쓸 때 내부 캐싱을 수행합니다. 분명히 자식 프로세스는 파일을 닫지 않고 캐시를 비우지 않고 종료합니다. out_file.seek(0) 문에는 캐시 플러시의 부작용이 있습니다. out_file.flush()과 동일하게 달성 할 수 있습니다.

하지만 실제로는 파일 이름을 하위 프로세스로 전달하십시오. 그렇지 않으면 당신이 달성 한 것은 운영체제와 Python 버전 사이에서 다를 것입니다.

+0

네가 맞아. 파일 이름을 전달하는 것은'seek'을 요구하지 않고 예상대로 작동합니다. 감사. – polarise