2

次のコードは非常に単純で、テストのみを目的としていますが、必要な出力が得られません。

from multiprocessing import Process,Lock

def printing(l,i):
    l.acquire()
    print i
    l.release()

if __name__ == '__main__':
    lock = Lock()

    for i in range(10):
        Process(target=printing,args=(lock,i)).start()

出力は次のとおりです。

0
1
2
3
5
6
4
7
8
9

ロックは、他のプロセスの実行を中断することになっています。なぜここで起こっていないのですか?

4

1 に答える 1

4

どのような出力を期待していましたか? 出力は私には問題ないように見えます: の順列ですrange(10)。プロセスがたまたま実行される順序は、実行ごとに異なる場合があります。それは予想されます。

ロックの機能を誤解していると思われます。ロックを取得すると、同じロックを取得しようとする他のすべてのプロセスも、ロックが解放されるまでブロックされます。それで全部です。テストの実行では、たまたまプロセス 0 が最初にロックを取得しました。ロックを取得しようとする他のプロセスは、プロセス 0 がロックを解放するまでブロックされます。プロセス 0 は、出力0してからロックを解放します。その後、たまたまプロセス 1 がロックを取得しました。等。

をコメントアウトするl.release()と、プログラムが終了しないことがわかります。たまたまロックを取得した最初のプロセスがその整数を出力し、他のすべてのプロセスはロックを取得するために永久にブロックされます。

于 2013-10-06T18:50:23.307 に答える