w/w +モードのいずれかを使用して、同じファイルに並列プロセスを書き込んでいる場合は、linuxで。 2つのプロセスから書き込まれたデータが混在する可能性はありますか?または、wモードは既存のファイルを切り捨てるため、常に1つのプロセスからのデータは常に所定の時刻に格納されますか?wモードを使用したPython
答えて
プロセスAがあり、プロセスBが同じファイルを書き込むとします。
AがAファイルを編集した後にBがファイルを書き込むと、Aの編集内容は消えます(w/w +モードはa/a +追加モードではありません)。
AがBを編集した後にファイルを書き込むと、Bの編集内容が消えます。
Aがファイルを編集した後にファイルを開くと、結果はプログラムによって異なります。 AまたはAの編集による予期しない編集が再び消えるため、エラーが発生する可能性があります。ただし、プログラムで追加モードを真似していない場合は、編集内容は積み重ねられません。
逆も同様です。
実際に最後の作家が勝つでしょう。
w/w +モードを非同期に処理することは良い考えではないことに注意する必要があります。しかし、この "混乱した"状況は、書き込みモードではなく追加モードでのみ発生する可能性があります。
それは私が確かめたいと思ったことです。私はw/w +を使用することでデータが乱雑にならないようにしたかっただけです。私は何かが上書きされて削除された場合気にしない – user4906231
@ user4906231ええ、私はあなたが私の答えに満足していることを嬉しく思っています。 – mertyildiran
私はPythonを使用しているすべてのOSで本当ですか? – user4906231
それはすべてあなたがファイルを開いて、どのようなプラットフォームあなたがそれを開く方法によって異なります。
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スレッドにデータを送信します。
最初の例では、2つのスレッド間でデータが混ざり合うことはありませんか?彼らはいつもお互いに優先されますよね? – user4906231
最後のスレッドがファイルを最後に開くと、残りのファイルに書き込まれます。 –
- 1. Python tkinterアンカーを使用したテキスト表示GUI = W
- 2. w +モードのpythonでファイルを読み取れません
- 3. %wまたは%Wの変数を使用する - Ruby
- 4. Pythonパッケージのモードを使用する
- 5. Python - wとwの間の理解の差を設定しました。
- 6. r +モードとw +モードの正確な違いは何ですか?
- 7. 例外IOError:[errnoを22]無効なモード(「W」)またはファイル名
- 8. ViewPagerを使用した没入型モード
- 9. SQL Serverモードを使用したasp.netセッション
- 10. ディスパッチャを使用したスパーク・メゾ・クラスタ・モード
- 11. Teradataを使用したモード計算
- 12. デバッグDLLを使用した製品モード
- 13. 混在モードを使用したSpELメモリリーク
- 14. JavaScriptを使用した計算モード
- 15. S3 + CloudFrontを使用した保守モード
- 16. WolfCryptを使用したECBモードのAES
- 17. ptyモードでlibsshを使用したstderr
- 18. `T.dot(l3、w)`、python
- 19. pythonを使用してFTPアップロード、rbモードで問題が発生しました
- 20. 地域:IOError:[Errno 22]無効なモード( 'w')またはファイル名
- 21. Pythonの正規表現\ W:括弧のない対を使用
- 22. Pythonを使用して二重モードでPDFファイルを印刷
- 23. 正規表現\ w \ w *を使用して文字列を分割しますか? \ w +?
- 24. html jQuery w/out Draggableを使用したドラッグアンドドロップ
- 25. pythonオープン組み込み関数:モード "aw"と "a"または "aw"と "w"の違い
- 26. Odoo 10アセットを使用した開発者モードと開発者モード
- 27. YouTube APIビデオアップロードエラー:parseError/w python
- 28. 抽出URLは、Python wは
- 29. 生産モードでDerbyまたはHSQLを使用した経験
- 30. Cake w/url extensionsを使用する
あまり回答はありませんが、関連性があります。 http://stackoverflow.com/questions/12942915/understanding-concurrent-file-writes-from-multiple-processes – Goodies
私の例でのように上書きされない場合を正しく扱っていると私が理解していれば、あなたが提供したリンクは – user4906231
ですここでの問題は、必ずしも複数のプロセスがファイルに書き込むことができないためではありません。しかし、問題はファイルの書き方がPythonやそのシステムで実装されていることです。例えば、 'fopen'はI/O用の独自の内部バッファを持ち、他のものを上書きします。私の場合、クローズする最後のストリームがそこに入っていることがわかりましたが、 'file.flush()'と 'file()を使ってドキュメント全体を一度に1文字ずつ上書きすることができます'はオープンオブジェクトです。 – Goodies