0

セマフォを使用して複数のプロセスを同期しようとしています。プロセスごとに関数を作成する代わりに、単一の関数と依存関係のいくつかの引数を使用して、より一般的な方法で可能かもしれないと考えました。

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

しかし、同期は期待どおりに機能しません。実行はデッドロックを含めてランダムです。何故ですか?

4

2 に答える 2

1

[Semaphore(0)]*(size + 1)単一のオブジェクトsize + 1への参照を含むリストを作成します。そのクラスのさまざまなインスタンスを作成する必要があります。 Semaphore

self._semaphores = [Semaphore(0) for _ in range(size + 1)]
于 2013-05-21T21:54:32.917 に答える