【Ruby3.x】File::flock()メソッドの使い方
flockメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
flockメソッドは、ファイルに対するロック操作を実行するメソッドです。複数のプログラムやプロセスが同じファイルに同時にアクセスする際に、データの破損や競合を防ぎ、整合性を保つために利用されます。
このメソッドでは、主に以下の2種類のロックを設定できます。一つは「共有ロック(Shared Lock)」で、複数のプロセスが同時にファイルを読み込むことは許可しますが、書き込みは制限します。これは、ファイルを安全に参照する際に役立ちます。もう一つは「排他ロック(Exclusive Lock)」で、一度に1つのプロセスのみがファイルを読み書きすることを許可します。他のプロセスからのアクセスはブロックされ、ロックが解除されるまで待機するか、エラーを返します。これにより、ファイルへの排他的な書き込みアクセスを保証できます。
flockメソッドに渡す引数には、これらのロックの種類や操作を指定するための定数を使用します。例えば、File::LOCK_SHで共有ロックを、File::LOCK_EXで排他ロックを要求します。File::LOCK_UNを指定すると、設定されているロックを解除できます。また、File::LOCK_NBを他のロック定数と組み合わせて使うと、ロックがすぐに取得できない場合でもプロセスをブロックせず、すぐに失敗を意味するfalseを返させることができます。
メソッドは、ロックの取得または解除に成功した場合はtrueを返します。File::LOCK_NBが指定され、かつロックが取得できなかった場合はfalseを返します。このロックは、ファイルが開いている間有効で、明示的に解除されるか、ファイルが閉じられるまで維持されます。ただし、flockの具体的な動作はオペレーティングシステムに依存する場合がありますので注意が必要です。
構文(syntax)
1file = File.open("resource.txt", "w") 2file.flock(File::LOCK_EX) # 排他ロック (書き込み用) を取得 3file.flock(File::LOCK_UN) # ロックを解除 4file.close
引数(parameters)
cmd
- cmd: ロック操作の種類を指定するシンボル(:exclusive、:shared、:unlock)
戻り値(return)
Integer または Boolean
File.flock は、ファイルロックの操作が成功した場合は 0 を、失敗した場合はロックの種類に応じたエラーコード(Integer)を返します。また、ロックの操作が非ブロックモードで実行され、ロックの取得に失敗した場合は false を返すこともあります。