2 Stimmen

Sperren im multiprocessing-Paket funktioniert nicht

Der folgende Code ist sehr einfach, ausschließlich zu Testzwecken, aber ich erhalte nicht die gewünschte Ausgabe:

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()

Die Ausgabe ist:

0
1
2
3
5
6
4
7
8
9

Locks sollen die Ausführung der anderen Prozesse aussetzen. Warum passiert das hier nicht?

4voto

Tim Peters Punkte 63170

Welche Ausgabe haben Sie erwartet? Die Ausgabe sieht für mich in Ordnung aus: eine Permutation von range(10). Die Reihenfolge, in der die Prozesse ausgeführt werden, kann von Durchlauf zu Durchlauf variieren. Das ist zu erwarten.

Ich vermute, dass Sie nicht verstehen, was ein Sperrschloss macht. Wenn Sie ein Sperrschloss erwerben, wird jeder andere Prozess, der versucht, dasselbe Schloss zu erwerben, blockiert, bis das Sperrschloss freigegeben wird. Das ist alles. In Ihrem Testlauf hat Prozess 0 zufällig als Erster das Schloss erworben. Jegliche anderen Prozesse, die versuchen, das Schloss zu erwerben, werden blockiert, bis Prozess 0 das Schloss freigibt. Prozess 0 druckt 0 und gibt dann das Sperrschloss frei. Dann hat es sich so ergeben, dass Prozess 1 das Schloss erworben hat. usw.

Kommentieren Sie Ihr l.release() aus, und Sie werden feststellen, dass Ihr Programm nie beendet wird: der erste Prozess, der das Sperrschloss zufällig erwirbt, druckt dann seine ganze Zahl, und alle anderen Prozesse sind für immer blockiert, während sie darauf warten, das Sperrschloss zu erwerben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X