web-dev-qa-db-ja.com

Python Linuxのシステム全体のミューテックス

LinuxでPythonにシステム全体のミューテックスを使用する簡単な方法はありますか?「システム全体」とは、ミューテックスがPythonprocesses;これは、同じ内のthreadsのグループによって使用される従来のミューテックスとは対照的です処理する。

編集:Pythonの multiprocessing パッケージが必要かどうかわかりません。たとえば、2つの異なるインタープリターで次を実行できます。

from multiprocessing import Lock
L = Lock()
L.acquire()

これらのコマンドを2つの別々のインタープリターで同時に実行すると、そのうちの1つがハングします。代わりに、どちらもハングしません。同じミューテックスを取得していないようです。

50
emchristiansen

Unixの「伝統的な」答えは、ファイルロックを使用することです。 lockf(3)を使用して、ファイルのセクションをロックして、他のプロセスが編集できないようにすることができます。非常に一般的な悪用は、これをプロセス間のミューテックスとして使用することです。 python同等のものは fcntl.lockf です。

従来、ロックプロセスのPIDをロックファイルに書き込むので、ロックを保持している間にプロセスが停止することによるデッドロックを識別および修正できます。

ロックはグローバルネームスペース(ファイルシステム)内にあり、すべてのプロセスにアクセスできるため、これで目的のものが得られます。このアプローチには、非Pythonプログラムがロックに参加できるという利点もあります。欠点は、このロックファイルが存在する場所が必要なことです。また、一部のファイルシステムは実際には正しくロックされないため、暗黙のうちに除外に失敗するリスクがあります。勝ち、負けます。

29
zmccord

POSIX標準は、この目的に使用できるプロセス間セマフォを指定しています。 http://linux.die.net/man/7/sem_overview

Python)のmultiprocessingモジュールは、このAPIや他のAPIに基づいて構築されています。特に、_multiprocessing.Lock_はクロスプロセスの "mutex"を提供します。 http: //docs.python.org/library/multiprocessing.html#synchronization-between-processes

[〜#〜] edit [〜#〜]編集した質問に応答するには:

概念実証では、各プロセスがLock()を構築しています。したがって、2つの個別のロックがあります。そのため、どちらのプロセスも待機しません。プロセス間で同じロックを共有する必要があります。 multiprocessingのドキュメントでリンクしているセクションで、その方法を説明しています。

12
wberry

ilock libraryを試してください:

from ilock import ILock

with ILock('Unique lock name'):
    # The code should be run as a system-wide single instance
    ...
8
Symon

絶対に別々のプロセス(つまり、同じプロセスツリーに属さないLinuxプロセスを含む)の同期を可能にするシステム全体のミューテックスの場合は、単に fcntl.flock を使用します。 Linuxの/ run/shmフォルダーの下でメモリファイルを使用すると、実行速度が速くなると思います。

詳しくは こちら をご覧ください。

1
Ofer

リストに1つ追加するだけで、Semaphoreクラスを持つ posix_ipc ライブラリがあります。

カウント1のSemaphoreは、Mutexとして使用できます。スレッドのトリオを完了するために、 SystemEvent ライブラリはposix_ipcおよびEventも提供します。

0
c z