web-dev-qa-db-ja.com

Python複数のユーザーが同じファイルに同時に追加する

私はWeb経由でアクセスされるpythonスクリプトに取り組んでいるので、複数のユーザーが同時に同じファイルに追加しようとするでしょう。これは、複数のユーザーが同時に同じファイルに書き込んだ場合に、ファイルが破損する可能性がある競合状態。

例えば:

#!/usr/bin/env python

g = open("/somepath/somefile.txt", "a")
new_entry = "foobar"
g.write(new_entry)
g.close

この操作は危険に見えるので、ロックファイルを使用する必要がありますか?.

27
Ray Y

ファイルロックを使用できます

import fcntl
new_entry = "foobar"
with open("/somepath/somefile.txt", "a") as g:
    fcntl.flock(g, fcntl.LOCK_EX)
    g.write(new_entry)
    fcntl.flock(g, fcntl.LOCK_UN)

一部のシステムでは、小さなバッファーのみを書き込む場合、ロックが必要ないことに注意してください。これらのシステムでは が追加されるためですアトミック

32
phihag

Linuxでこの操作を実行していて、キャッシュサイズが4KBより小さい場合、書き込み操作はアトミックであり、問​​題ありません。

ここでさらに読む:NIXでファイル追加はアトミックですか?

1
user1767754

プラットフォーム/ファイルシステムの場所によっては、これは安全な方法(NFSなど)では実行できない場合があります。おそらく、別のファイルに書き込んで結果を後でマージできますか?

0
Karol Nowak

使用しているプラ​​ットフォームは明記していませんでしたが、クロスプラットフォームで使用できるモジュールを次に示します。 Pythonでのファイルロック

0
Qiau