37

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

例えば:

#!/usr/bin/env python

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

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

4

4 に答える 4

46

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

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)

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

于 2012-08-07T20:27:12.143 に答える
2

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

于 2012-08-07T20:26:59.660 に答える
1

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

于 2012-08-07T21:00:52.917 に答える