5

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

4

3 に答える 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 に答える