セマフォを使用して複数のプロセスを同期しようとしています。プロセスごとに関数を作成する代わりに、単一の関数と依存関係のいくつかの引数を使用して、より一般的な方法で可能かもしれないと考えました。
import multiprocessing
from multiprocessing import *
class Worker:
def __init__(self, size):
self._semaphores = [Semaphore(0)]*(size + 1)
def run(self, name, acquire, release):
for i in acquire:
self._semaphores[i].acquire()
print('Running', name)
for i in release:
self._semaphores[i].release()
この場合、5 つのプロセスがあります。1 番目が最初に開始し、2 番目と 3 番目が 1 番目の後に開始され、4 番目が 2 番目と 3 番目の後に開始され、5 番目が 4 番目の後に開始されます。
if __name__ == '__main__':
worker = Worker(5)
Process(target=worker.run, args=('5', [5], [])).start()
Process(target=worker.run, args=('4', [4,4], [5])).start()
Process(target=worker.run, args=('3', [3], [4])).start()
Process(target=worker.run, args=('2', [2], [4])).start()
Process(target=worker.run, args=('1', [], [2,3])).start()
予想される出力は次のようになります。
Running 1
Running 2
Running 3
Running 4
Running 5
しかし、同期は期待どおりに機能しません。実行はデッドロックを含めてランダムです。何故ですか?