PassengerまたはMongrelを介してRailsをデプロイする場合、アプリケーションの複数のインスタンスが実行されています。ローカルファイルやリモートファイルへの書き込みなど、共有リソースでミューテックスを確立するためのベストプラクティスまたはパターンは何ですか。2つのプロセスが同時に同じリソースに書き込んでいないことを確認したいと思います。
3736 次
3 に答える
15
複数のライターがファイルを同時に操作するのを防ぐ必要がある場合は、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
ファイルをロックした後にキャッチされない例外がスローされた場合にデッドロックを防ぐために、ロック解除呼び出しをブロックに入れることが重要です。
于 2009-09-22T18:23:31.987 に答える
2
バックグラウンド ジョブ スケジューラを使用して実際の作業を行うことができます。たとえば、delayed_job ( http://github.com/tobi/delayed_job )。
于 2009-09-22T18:13:55.727 に答える
2
私の知る限り、このような環境でこれを行う唯一の方法は、ファイルベースのセマフォを使用することです。ロックファイルに触れ、作業を行い、ロックファイルを削除します。ファイルにロックがある場合、プロセスを失敗させます。
また、スレッド化されたファイルに書き込むサービスを用意し、アプリにファイルを直接変更させるのではなく、サービスと通信させてファイルを変更させることもできます。
于 2009-09-22T18:04:55.963 に答える