1

flock()特にpythonでどのように機能するかについて質問があります。シリアル接続を開くモジュールがあります (経由os.open())。このスレッドを安全にする必要があります。を使用して同じモジュールで作業するときにスレッドセーフにするのは簡単threading.Lock()ですが、モジュールが別の場所からインポートされると壊れます。

を使用することを考えてflock()いましたが、 flock がどのように機能するかについて十分な情報を見つけるのに苦労しています。ファイルが閉じられると、 flock() がファイルのロックを解除することを読みました。しかし、Python がクラッシュした場合にファイルを開いたままにする状況はありますか?

が設定されている場合、ロックされたファイルの使用を正確に許可するものは何LOCK_EXですか? ファイルをロックしたモジュールだけですか?最初に実行されたスクリプトからインポートされたモジュールはありますか?

4

1 に答える 1

2

プロセスが終了すると、OSは開いているファイル リソースをすべてクリーンアップする必要があります (いくつかの注意事項がありますが)。これは、pythonプロセスが終了するときに OS クリーンアップの一部として実行される操作である、ファイルが閉じられるときにアドバイザリ ロックが解放されるためです。

flock(2)は単なるアドバイスであることを忘れないでください:

アドバイザリ ロックにより、協調プロセスはファイルに対して一貫した操作を実行できますが、[他の、動作の悪い] プロセスは、アドバイザリ ロックを使用せずにそれらのファイルにアクセスする可能性があります。

flock(2)は、リーダー/ライター ロックを実装します。で同じファイルを 2 回群化することはできませんLOCK_EXが、任意の数の人がLOCK_SH同時に群れを作ることができます (他の誰も を持っていない限りLOCK_EX)。

ロック メカニズムでは、共有ロックと排他ロックの 2 種類のロックが可能です。いつでも複数の共有ロックをファイルに適用できますが、ファイルに対して複数の排他ロック、または共有ロックと排他ロックの両方を同時に適用することはできません。

flock は OS/プロセス レベルで動作し、python モジュールから独立しています。1 つのモジュールがn 個のロックを要求する場合もあれば、 m 個のモジュールにわたってn個のロックを要求する場合もあります。ただし、特定の時間に特定のファイルのロックを保持できるプロセスは 1 つだけです。LOCK_EX

「非 UNIX」システムまたは非ローカル ファイルシステム上の YMMV。

于 2010-10-12T20:01:34.833 に答える