1. ホーム
  2. python

[解決済み] Pythonにおけるミューテックスの適切な使用法

2022-02-12 05:24:37

質問

私はpythonでマルチスレッドを始めています(少なくとも私のスクリプトが複数のスレッドを作成する可能性があります)。私はまだこのコードをテストしていませんし、おそらく動作しないでしょう。私はprocessDataをスレッドで実行し(一度に1つ)、メインのwhileループは、キューにスレッドがあっても実行し続けたいだけなのです。

from threading import Thread
from win32event import CreateMutex
mutex = CreateMutex(None, False, "My Crazy Mutex")
while(1)
    t = Thread(target=self.processData, args=(some_data,))
    t.start()
    mutex.lock()

def processData(self, data)
    while(1)
        if mutex.test() == False:
            do some stuff
            break

編集:私のコードを読み直すと、それは非常に間違っていることがわかります。しかし、ちょっと、それは私がここで助けを求めている理由です。

どのように解決するのですか?

なぜPythonのミューテックスではなく、Windowのミューテックスを使っているのかわかりません。 Pythonのメソッドを使えば、これはとても簡単なことです。

from threading import Thread, Lock

mutex = Lock()

def processData(data):
    mutex.acquire()
    try:
        print('Do some stuff')
    finally:
        mutex.release()

while True:
    t = Thread(target = processData, args = (some_data,))
    t.start()

しかし、CPythonのアーキテクチャのため(すなわち グローバルインタープリターロック I/Oバインドされたスレッドが他のスレッドの実行をブロックしないように、できるだけロックを解放したいところですが。

Python 2.6 以降では、Python の multiprocessing パッケージで提供されます。 このパッケージは threading パッケージの中で、全く新しいプロセスを作成します。 できる が同時に実行されます。 あなたの例を更新するのは簡単なことです。

from multiprocessing import Process, Lock

mutex = Lock()

def processData(data):
    with mutex:
        print('Do some stuff')

if __name__ == '__main__':
    while True:
        p = Process(target = processData, args = (some_data,))
        p.start()