2009-09-22 12 views
5

PassengerまたはMongrel経由でRailsを配備する場合、アプリケーションの複数のインスタンスが実行されています。ローカルファイルやリモートファイルへの書き込みなど、共有リソース上にミューテックスを確立するためのベストプラクティスまたはパターンとは何ですか?私は、2つのプロセスが同じリソースに同時に書き込まれないようにしたい。Mutex for Railsプロセス

答えて

14

は、各プロセスから排他的な書き込みロックを要求するFile#flockメソッドを使用することができます。

fh = File.new("/some/file/path") 
begin 
    fh.flock(File::LOCK_EX) 
    # ... write to the file here, or perform some other critical operation 
ensure 
    fh.flock(File::LOCK_UN) 
end 

注:アンロックコールを置きますensureブロックは、ファイルをロックした後にキャッチされない例外がスローされた場合にデッドロックを防止するために重要です。

+1

優秀な説明。 –

+1

ファイルがロックされているかどうかを確認するにはどうすればよいですか?私はグローバルロックとしてファイルを使用したい、#flockは私と一緒に見えますが、別のプロセスが使用可能かどうかを確認する必要があります、どうすれば解決できますか? –

+0

@HarisKrajina、 'flock(File :: LOCK_EX | File :: LOCK_NB)'が 'false'を返した場合、ファイルはロックされます。ドキュメントについては、 'ri File.flock'を参照してください。 –

2

私が知る限り、このような環境でこれを行う唯一の方法は、ファイルベースのセマフォを使用することです。ロックファイルに触れ、作業を行い、ロックファイルを削除します。ファイルにロックがある場合、プロセスを失敗させます。

また、スレッドされたファイルに書き込みを行い、アプリケーションが直接ファイルを変更するのではなく、ファイルを修正するためにサービスと通信するようにすることもできます。

1

たとえば、delayed_job(http://github.com/tobi/delayed_job)のように、バックグラウンドジョブスケジューラを使用して実際の作業を行うことができます。あなただけ同時にファイルでの作業から複数の作家を防ぐために必要がある場合は