Ich versuche, die Grundlagen von Threading und Parallelität zu verstehen. Ich möchte einen einfachen Fall, in dem zwei Threads wiederholt versuchen, auf eine freigegebene Ressource zuzugreifen.Python-Threading. Wie sperre ich einen Thread?
Der Code:
import threading
class Thread(threading.Thread):
def __init__(self, t, *args):
threading.Thread.__init__(self, target=t, args=args)
self.start()
count = 0
lock = threading.Lock()
def incre():
global count
lock.acquire()
try:
count += 1
finally:
lock.release()
def bye():
while True:
incre()
def hello_there():
while True:
incre()
def main():
hello = Thread(hello_there)
goodbye = Thread(bye)
while True:
print count
if __name__ == '__main__':
main()
Also, ich habe zwei Threads, die beide versuchen, den Zähler zu erhöhen. Ich dachte, dass, wenn der Thread "A" incre()
heißt, die lock
eingerichtet würde, wodurch verhindert wird, dass "B" zugreift, bis "A" freigegeben wurde.
Das Ausführen der macht es klar, dass dies nicht der Fall ist. Sie erhalten alle zufälligen Daten race-ish Inkrementen.
Wie genau wird das Sperrobjekt verwendet?
Edit, Zusätzlich habe ich versucht, die Sperren innerhalb der Thread-Funktionen, aber immer noch kein Glück.
Ihr Code nicht ausgeführt. –
@Ignacio Vazquez-Abrams - Sollte jetzt. Ich habe das 'if __name__' Bit weggelassen. Hast du damit gemeint? – Zack
Es läuft auch nicht für mich. Ich würde erwarten, dass Ihre Thread-Erstellung wie folgt aussehen würde: 'hallo = threading.Thread (target = hallo_there)' und dann, damit der Thread 'hello.start()' gestartet wird. –