Странная переменная приводит к поточной обработке объектов класса - PullRequest
0 голосов
/ 13 апреля 2019

Существует два класса: один - один производитель (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 ()метод

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...