シナリオ: ネット経由でファイルをフェッチする必要があるプロセスを多数実行しています。ファイルが既にダウンロードされている場合は、ディスクにキャッシュします。別のプロセスがファイルをダウンロードしている場合は、ダウンロードが完了するまでブロックします。
これを行う最も簡単な方法を見つけようとしています。明らかな方法は次のとおりです。
create file w/ an exclusive lock active on it only if it doesn't exist (O_CREAT | O_EXCL)
if file exists already:
open file and acquire exclusive lock
else:
download to newly created file
release lock
このシステムは、(一見) 競合状態なしで上記の目標を達成します。
残念ながら、open() などを使用して Linux でロックされたファイルを作成する方法に関するドキュメントは見つかりませんでした。作成ステップを次のように分割すると:
open w/ O_CREAT | O_EXCL
flock
作成とロックの間に競合状態が存在するようになりました (非作成プロセスは、作成者がロックを取得する前にロックを取得します)。
ファイルごとに外部ロックファイル (例: filename + '.lock) を使用できることに気付きました。これは、ファイル名を作成する前に取得しますが、これは.. 洗練されていないと感じます (そして、実際に.lock サフィックス!)
とにかくアトミックに作成してロックする方法はありますか(Windowsが提供するように)、または外部ロックファイルメソッドは標準/必須のものですか?