2

Pythonのマルチプロセッシングモジュールページから次のコードを実行すると:

from multiprocessing import Process, Lock

def f(l, i):
    l.acquire()
    print 'hello world', i
    l.release()

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

    for num in range(10):
        Process(target=f, args=(lock, num)).start()

次のような順序付けられていない出力が表示されることがあります。

hello world 0
hello world 1
hello world 2
hello world 4
hello world 3
hello world 6
hello world 5
hello world 7
hello world 8
hello world 9

4は3の前に印刷され、6は5の前に印刷されることに注意してください。なぜですか。

4

2 に答える 2

3

の全体のポイントmultiprocessing並列処理だからです。プロセスは互いに同時に実行されているため、実際には任意の順序で開始および終了できます。

print ロックの取得は、同時に試行しないことを保証するだけですが、そのロックは、さまざまなプロセスによって任意のランダムな順序で取得される可能性があります。最初に作成したプロセスによって取得される可能性が高くなります。これは、そのプロセスが初期化をより早く実行し、ロックを要求する最初のプロセスになる可能性が高いためです。ただし、注文の保証はありません。

于 2013-02-27T20:38:27.600 に答える
1

これは、OSが最初に実行するスケジュールをどのようにスケジュールするかによって異なり、ロックによって同時に複数のOSが実行されるのを防ぐことができます。

于 2013-02-27T20:40:34.670 に答える