python的threading模块中Lock类具体该怎么使用?

import threading

class WindowThread(threading.Thread):

    def __init__(self, name, lock):
        threading.Thread.__init__(self,name=name)
        self.name = name
        self.tickts = 0
        self.lcok = lock

    def run(self):
        global tickt_count

        while tickt_count > 0:
            lock.acquire()
            print('%s总余票:%d' %(self.name,tickt_count))
            tickt_count -= 1
            self.tickts += 1
            print('%s已购买1张,总剩余票数:%d,当前窗口售卖票数:%d' % (self.name, tickt_count, self.tickts))
            lock.release()
        print('%s已售罄!当前窗口卖出:%d'%(self.name,self.tickts))
        print('-' * 30)


tickt_count = 10
lock = threading.Lock()
window1 = WindowThread('窗口1', lock)
window2 = WindowThread('窗口2', lock)
window3 = WindowThread('窗口3', lock)

window1.start()
window2.start()
window3.start()
window1.join()
window2.join()
window3.join()

print('余票:',tickt_count)

像这个示例代码,我在tickt_count的计算前后加了锁,可是结果依旧会出现负数

img

如果我把这个锁加到while循环外面,虽然不再会出问题,但执行了数次发现似乎并没有多线程运行,只有window1.start()执行了

import threading

class WindowThread(threading.Thread):

    def __init__(self, name, lock):
        threading.Thread.__init__(self,name=name)
        self.name = name
        self.tickts = 0
        self.lcok = lock

    def run(self):
        global tickt_count
        lock.acquire()
        while tickt_count > 0:

            print('%s总余票:%d' %(self.name,tickt_count))
            tickt_count -= 1
            self.tickts += 1
            print('%s已购买1张,总剩余票数:%d,当前窗口售卖票数:%d' % (self.name, tickt_count, self.tickts))
        lock.release()
        print('%s已售罄!当前窗口卖出:%d'%(self.name,self.tickts))
        print('-' * 30)


tickt_count = 10
lock = threading.Lock()
window1 = WindowThread('窗口1', lock)
window2 = WindowThread('窗口2', lock)
window3 = WindowThread('窗口3', lock)

window1.start()
window2.start()
window3.start()
window1.join()
window2.join()
window3.join()

print('余票:',tickt_count)

如果这样执行,结果就会是只有window1.start()在执行,如果这样是正确的,那我怎么确定这个是否有多线程执行呢

img

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。