質問
どのように質問があります flock()
特にPythonで機能します。シリアル接続を開くモジュールがあります(経由 os.open()
)。このスレッドを安全にする必要があります。同じモジュールを使用して作業するときに安全にスレッドにするのは簡単です threading.Lock()
, 、しかし、モジュールが異なる場所からインポートされると、壊れます。
私は使うことを考えていました flock()
, 、しかし、私は正確な群れがどのように機能するかについての十分な情報を見つけるのに苦労しています。 Flock()がファイルが閉じた後にファイルのロックを解除することを読みました。しかし、Pythonがクラッシュした場合、ファイルを開いたままにする状況はありますか?
そして、ロックされたファイルを正確に使用することが許可されているもの LOCK_EX
セットですか?ファイルをロックしたモジュールだけですか?元々実行されていたスクリプトからインポートされたモジュールはありますか?
解決
プロセスがOSで死ぬとき したほうがいい オープンファイルリソースをクリーンアップします(いくつかの注意事項を使用して、確信しています)。これは、ファイルが閉じられているときにアドバイザリーロックがリリースされるためです。 python
プロセス出口。
覚えて、 群れ(2) 単なるアドバイザリーです:
アドバイザリーロック許可 協力 ファイルで一貫した操作を実行するプロセスですが、[その他の、動作が不十分な]プロセスは、アドバイザリーロックを使用せずにそれらのファイルにアクセスする場合があります。
群れ(2) 読者のライターロックを実装します。同じファイルを2回群がることはできません LOCK_EX
, 、しかし、何人かの人々がそれを群ることができます LOCK_SH
同時に(他の誰も持っていない限り LOCK_EX
その上)。
ロックメカニズムにより、共有ロックと排他的ロックの2種類のロックが可能になります。いつでも複数の共有ロックがファイルに適用される場合がありますが、ファイル上で同時に許可されているロックが複数排他的であるか、共有された排他的であることはありません。
FlockはOS/Processレベルで機能し、Pythonモジュールに依存しません。 1つのモジュールが要求する場合があります n ロック、または n ロックを要求することができます m モジュール。ただし、1つのプロセスのみを保持できます LOCK_EX
特定のファイルを特定の時間にロックします。
YMMV「非UNIX」システムまたは非ローカルファイルシステム。