- ベストアンサー
ファイルロックの精度とパフォーマンスについて
- Perlのファイルロックについて教えてください。ファイルロックを使用してファイルの同時アクセスを制御していますが、同時に多数のアクセスがあるとレスポンスが遅くなることがあります。
- ファイルロックの精度に問題はありますか?また、ファイルロックによってパフォーマンスが悪くなる可能性はありますか?
- 論理ファイルを読み込んでデータを絞り込み、その結果をPOSTしています。ファイルロックがパフォーマンスに影響を与えることはありますか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
失礼…、ANo.1のコード、open文のカッコ閉じが抜けていました。
その他の回答 (1)
- taseki
- ベストアンサー率66% (155/233)
実際のサーバー負荷やスクリプトのパフォーマンスなど解らないので、また「10分くらいレスが返ってこなく」という部分もちょっと解らない(httpdのタイムアウトにならない?)ので何とも言えませんが、ただ基本的にファイルロックの手法として少々問題があるように思います。 まずflockの第2引数でLOCK_NB(4)を付加して、「ノンブロック」を指定しないと、ロックできるまで固まったようになってしまいます。 また、もしロックに失敗した場合(複数のアクセスが重なった、など)の処理がありませんので、これもやはり行き場がなくなります。 サンプルコード ロックできなかったら1秒待ち、それを20回繰り返します。それでもロックできなかったらエラーにします。 ------------------------------------ use Fcntl qw(:DEFAULT :flock); my $lock_file = '/tmp/test.lock'; &file_lock($lock_file) or &error(...) # ロック失敗 エラー処理 # ロック成功 # ファイル出力処理など… open ... print ... : : sub file_lock { local *FH; my $file_path = $_[0]; my $locked = 0; foreach (1 .. 20) { open(FH, ">$file_path" or return; if (flock(FH, LOCK_EX | LOCK_NB)) { $locked = 1; last; } sleep(1); # 1秒待機 } return $locked; } ------------------------------------ ※インデントに全角スペースを使っています。
お礼
taseki様、お礼を申し上げるのが大変遅くなり 申し訳ありませんでした。 サーバのスペックにも問題があるのと、ロジックでやっている 論理ファイルの処理が大分重かった為、論理ファイル自体を軽減 したのと、ご教授いただいたコードにて対応したら大分ストレスが 解消されました。 本当にありがとうございました。