7

Python スレッドとプロセス (相互に関連している必要はありません) を名前付きロック (ファイル ロックなど) と同期する必要があります。できれば、リーダーライター ロックにする必要があります。fcntl.flock を試しました (排他ロックと共有ロックの両方を取得します) が、必要なレベルのロックを提供しません - Python の fcntl.flock 関数は、ファイル アクセスのスレッド レベルのロックを提供しますか?

これまでの私の解決策は、lockfileを memcached (または mmap でロックされたファイル) で使用することです。Lockfile はアクセスを同期し、memcached はリーダー/ライターをカウントします。

より良い/より高速なソリューションはありますか? この問題をすでに解決しているプロジェクトを知っていますか?

4

1 に答える 1

2

posix およびシステム V セマフォを実装するライブラリへのリンクhttp://semanchuk.com/philip/を次に示します。それらのいずれかを使用できます。ただし、セマフォを保持しているプロセスが解放せずに終了した場合、他のすべてがスタックすることに注意してください。これが怖い場合は、System V セマフォを UNDO で使用できますが、少し遅くなります。また、たまたま System V 共有メモリ プリミティブを使用している場合 (これらはカーネル内に存在し、プロセスの終了後も存続することに注意してください)、それらをシステムから明示的に削除する必要があります。

プロセスが死ぬことを恐れておらず、システム全体とプロセスのデッドロックが関連している場合は、python のセマフォを使用できます (それらは posix の名前付きセマフォです)。

関連する質問 (fcntl) としてリンクしたページは、fcntl がスレッド間ロックに適していないとは言っていません。fcntl が fds を気にしていると言っています。そのため、ロック ファイルを開いてロック インスタンスごとに新しい fd を取得する限り、プロセス間およびスレッド間ロックに fcntl を使用できます。

プロセス間ロックには fcntl を、スレッド間ロックには Python のセマフォを組み合わせて使用​​することもできます。

そして最後に、アーキテクチャを再考してください。ロックは一般的に悪いです。ロックせずにリソースを処理するプロセスにリソースを委譲します。メンテナンスがはるかに簡単になります。私を信じてください。

于 2012-09-16T20:57:02.877 に答える