2016-12-06 9 views
1

w/w +モードのいずれかを使用して、同じファイルに並列プロセスを書き込んでいる場合は、linuxで。 2つのプロセスから書き込まれたデータが混在する可能性はありますか?または、wモードは既存のファイルを切り捨てるため、常に1つのプロセスからのデータは常に所定の時刻に格納されますか?wモードを使用したPython

+0

あまり回答はありませんが、関連性があります。 http://stackoverflow.com/questions/12942915/understanding-concurrent-file-writes-from-multiple-processes – Goodies

+0

私の例でのように上書きされない場合を正しく扱っていると私が理解していれば、あなたが提供したリンクは – user4906231

+0

ですここでの問題は、必ずしも複数のプロセスがファイルに書き込むことができないためではありません。しかし、問題はファイルの書き方がPythonやそのシステムで実装されていることです。例えば、 'fopen'はI/O用の独自の内部バッファを持ち、他のものを上書きします。私の場合、クローズする最後のストリームがそこに入っていることがわかりましたが、 'file.flush()'と 'file()を使ってドキュメント全体を一度に1文字ずつ上書きすることができます'はオープンオブジェクトです。 – Goodies

答えて

0

プロセスAがあり、プロセスBが同じファイルを書き込むとします。

AがAファイルを編集した後にBがファイルを書き込むと、Aの編集内容は消えます(w/w +モードはa/a +追加モードではありません)。

AがBを編集した後にファイルを書き込むと、Bの編集内容が消えます。

Aがファイルを編集した後にファイルを開くと、結果はプログラムによって異なります。 AまたはAの編集による予期しない編集が再び消えるため、エラーが発生する可能性があります。ただし、プログラムで追加モードを真似していない場合は、編集内容は積み重ねられません。

逆も同様です。

実際に最後の作家が勝つでしょう。

w/w +モードを非同期に処理することは良い考えではないことに注意する必要があります。しかし、この "混乱した"状況は、書き込みモードではなく追加モードでのみ発生する可能性があります。

How do you append to a file?

+0

それは私が確かめたいと思ったことです。私はw/w +を使用することでデータが乱雑にならないようにしたかっただけです。私は何かが上書きされて削除された場合気にしない – user4906231

+0

@ user4906231ええ、私はあなたが私の答えに満足していることを嬉しく思っています。 – mertyildiran

+0

私はPythonを使用しているすべてのOSで本当ですか? – user4906231

0

それはすべてあなたがファイルを開いて、どのようなプラットフォームあなたがそれを開く方法によって異なります。

Linux/Macの場合、ファイルシステムはinodesで、ファイルの特定のinodeを指します。ですから、このように動作しますいくつかのコードがある場合:起こるだろう何

import time 
import threading 

def write_one(): 
    f = open('test.txt', 'w') 
    f.write('something longer ') 
    time.sleep(0.5) 
    f.write(' something more') 

def write_two(): 
    f = open('test.txt', 'w') 
    time.sleep(0.1) 
    f.write('something shorter') 

if __name__ == '__main__': 
    t1 = threading.Thread(target=write_one) 
    t2 = threading.Thread(target=write_two) 

    t1.start() 
    t2.start() 

    t1.join() 
    t2.join() 
    print('Done') 

を一つのスレッドが書き込み用にファイルを開くことで、その後、次のスレッドが新しいiノードを指すように起こっているファイルを開いたとき、ちょうどファイル名が指す場所を変更します。

次のようないくつかのコードがある場合:

import time         
import threading        

f = open('test.txt', 'w')     

def write_one():        
    f.write('something longer ')    
    time.sleep(0.5)       
    f.write(' something more')    

def write_two():        
    time.sleep(0.1)       
    f.write('something shorter')    

if __name__ == '__main__':     
    t1 = threading.Thread(target=write_one) 
    t2 = threading.Thread(target=write_two) 

    t1.start()        
    t2.start()        

    t1.join()        
    t2.join()        
    print('Done') 

どちらのスレッドが同じファイルオブジェクトへのアクセス権を持ってしようとしています。あなたはおそらく動作する可能性があるコピーでいくつかの奇妙なことをすることができますが、私はそれに依存しません。

しかし、Windowsを使用している場合、最初の方法はおそらく動作しません。 Windowsは一度に複数のプロセスでファイルハンドルを開くのが好きではありません。それは大声で不平を言うでしょう、おそらく例外を起こします。

ただしないでください。より良い方法は、スレッドがIOを実行することです。ファイルに書き込む場合は、他のスレッドがキューを使用してIOスレッドにデータを送信します。

+0

最初の例では、2つのスレッド間でデータが混ざり合うことはありませんか?彼らはいつもお互いに優先されますよね? – user4906231

+0

最後のスレッドがファイルを最後に開くと、残りのファイルに書き込まれます。 –

関連する問題