2012-08-07 50 views
6

名前付きロック(例:ファイルロック)を使用して、Pythonスレッドとプロセス(互いに関連する必要はありません)を同期させる必要があります。リーダライタロックであることが望ましい。私はfcntl.flockを試してみました(それは排他と共有ロックの取得の両方を持っている)が、それはロックの所望のレベルを提供していません - Does python's fcntl.flock function provide thread level locking of file access?Python用の共有名前付きロック

私のソリューションは、これまでのmemcached(またはmmapによってロックされたファイル)とlockfileを使用することです。 Lockfileはアクセスを同期させ、memcachedはリーダ/ライタをカウントします。

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

+0

私はどんな解決策にも興味があります。 – cji

+0

[ilock](https://github.com/symonsoft/ilock)ライブラリを試してください – Symon

答えて

2

リンクhttp://semanchuk.com/philip/は、ライブラリがposixとsystem Vセマフォを実装しています。あなたはそれらの1つを使うことができます。セマフォを保持しているプロセスがセマフォを解放せずに終了する状況では、他のすべてが止まらないことに注意してください。これを恐れるならば、UNDOでSystem Vセマフォを使うことができますが、少し遅くなります。また、System Vの共有メモリプリミティブを使用する場合、カーネルに存在し、プロセスの終了後も生き続けることを忘れないでください。システムから共有メモリプリミティブを明示的に削除する必要があります。あなたが関連しているプロセスとシステム全体およびプロセスのデッドロックを死ぬのを恐れていない場合

- (。彼らはPOSIX名前付きセマフォです)あなたはPythonのセマフォを使用することができます

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

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

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

関連する問題