Napisałem prosty program testowy, używając blokad wątków. Ten program nie działa zgodnie z oczekiwaniami, a interpreter python nie narzeka.Nieoczekiwane zachowanie podczas używania blokad wątków python i importu circulair
test1.py:
from __future__ import with_statement
from threading import Thread, RLock
import time
import test2
lock = RLock()
class Test1(object):
def __init__(self):
print("Start Test1")
self.test2 = test2.Test2()
self.__Thread = Thread(target=self.myThread, name="thread")
self.__Thread.daemon = True
self.__Thread.start()
self.test1Method()
def test1Method(self):
print("start test1Method")
with lock:
print("entered test1Method")
time.sleep(5)
print("end test1Method")
def myThread(self):
self.test2.test2Method()
if __name__ == "__main__":
client = Test1()
raw_input()
test2.py:
from __future__ import with_statement
import time
import test1
lock = test1.lock
class Test2(object):
def __init__(self):
print("Start Test2")
def test2Method(self):
print("start test2Method")
with lock:
print("entered test2Method")
time.sleep(5)
print("end test2Method")
Oba śpi są wykonywane w tym samym czasie! Nie to, czego się spodziewałem podczas korzystania z zamka.
Kiedy test2Method zostanie przeniesiony do test1.py, wszystko działa poprawnie. Kiedy tworzę blokadę w test2.py i importuję ją w test1.py wszystko działa dobrze. Kiedy tworzę blokadę w osobnym pliku źródłowym i importuję ją zarówno w test1.py jak i test2.py wszystko działa poprawnie.
Prawdopodobnie ma to związek z importem Circulair.
Ale dlaczego Python na to nie narzeka?
Dzięki za wyjaśnienie. Python jest dla mnie całkiem nowy, nigdy nie natknąłem się na to zachowanie. Cieszę się, że zapytałem, ponieważ może się również zdarzyć w innych, nie przewracających się sytuacjach. – user1997293
@ user1997293: Tak, masz rację to zachowanie jest bardzo częste i cieszę się, że moja odpowiedź była pomocna :) – mouad