本記事は、Pythonで排他ロックをしようとしたら、けっこう苦労したという話です。排他ロックはOSに密接な機構であるせいか、Linuxでやる分には問題ないのですが、Windowsなども絡んでくると、なかなかどうして、うーん。
クロスプラットフォームでPythonの排他ロック
Pythonの排他制御については、Unixシステムにおいてはfcntlを使うのが良いらしく、これについては使用例もよく見受けられるのですが、Windowsについてはどうもこれといったものがなさそうです。「lockfile — Platform-independent file locking — lockfile 0.9.1 documentation」によると、Windowsにおいては「34.2. msvcrt – MS VC++実行時システムの有用なルーチン群 — Python 2.7ja1 documentation」を用いるのがスタンダードである、とのことですが、使用例もあまり見当たらず阿呆な私にはどうにもよくわからない。先のlockfileは、Pythonでクロスプラットフォームなロック機構を提供することを目指したパッケージのようですが、これについてもあまり情報がないので、Python初心者の私にはどうにも不安が残ります。os.openを使ってフラグ定数にO_EXLOCKを指定すればいいという話もありましたが、ドキュメント(「15.1. os — 雑多なオペレーティングシステムインタフェース — Python 2.6ja2 documentation」)を見るとO_EXLOCKはUnixのみ対応とありますし、そもそもos.openはかなり低レベルのAPIのようなので、使い方には気をつけねばならず私の手に負えなさそうです(ドキュメントでも基本的に組み込み関数のopen()を使うよう推奨されている模様)。
結局諦めて、手動でロックファイルを作成することに
アレコレと調べていくと、どうにも難しそうだったので、結局、ファイルの書き換え中は使用中であることを示すロックファイルを作成し、他プロセスからはロックファイルがないことを確認したうえでファイルを共有する、という泥臭い方法を取ることにしました。もっとスマートにできればよいのですが、まぁひとまずこれで目的は達せられるので、よいかな、と。
ファイルアクセスはもっともよく使う機能の一つでありながら、OSに密接したものであるために、クロスプラットフォームを目指すとなかなかどうして苦労します。
コメント