Существует два класса: один - один производитель (TT), а другой - несколько пользователей.Во время работы в потоках пользователи получают странную переменную от производителя, если я использую join (), я могу получить ожидаемый ответ (tt.x = 500000), но когда я не использую join (), я получаю tt.x>500000. Как это возможно, поскольку я могу увеличивать только до 500000, но получаю больше ожидаемого значения?, Тот же странный результат, когда я использую daemon = True в производителе.
Python 3.7.3, Windows 8
from threading import Thread, Lock
Класс производителя
class TT:
def __init__(self):
self.x = 0
self.lock = Lock()
def increment(self):
self.x += 1
def th(self):
with self.lock:
for _ in range(100000):
self.increment()
@property
def getx(self): return self.x
def main(self):
self.x = 0
t1 = Thread(target=self.th)
t2 = Thread(target=self.th)
t3 = Thread(target=self.th)
t4 = Thread(target=self.th)
t5 = Thread(target=self.th)
#t1.daemon=True; t2.daemon=True;t3.daemon=True; t4.daemon=True; t5.daemon=True;
t1.start(); t2.start(); t3.start(); t4.start(); t5.start()
t1.join(); t2.join(); t3.join(); t4.join(); t5.join()
def runmain(self):
for i in range(2):
self.main()
#print("i {0}: x = {1}".format(i,self.x))
Класс пользователя
class user:
def getx(self,threadno):
for i in range(3):
self.gx = tt.getx
print("------gx_{0} = {1}".format(threadno, self.gx))
def main(self):
for _ in range(2):
tt1 = Thread(target=self.getx, args=(1,))
tt2 = Thread(target=self.getx, args=(2,))
tt3 = Thread(target=self.getx, args=(3,))
tt4 = Thread(target=self.getx, args=(4,))
tt5 = Thread(target=self.getx, args=(5,))
tt1.start(); tt2.start(); tt3.start(); tt4.start(); tt5.start()
tt = TT()
u1 = user()
u2 = user()
u3 = user()
u4 = user()
u5 = user()
u6 = user()
u7 = user()
u8 = user()
tt.runmain()
u1.main()
u2.main()
u3.main()
u4.main()
u5.main()
u6.main()
u7.main()
u8.main()
В любом случае его следует увеличивать только до 500000, даже если он не используется с join ()метод