待满茶杯_ 2021-11-08 14:23 采纳率: 100%
浏览 23
已结题

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()执行了

  • 写回答

2条回答 默认 最新

  • 待满茶杯_ 2021-11-08 14:26
    关注
    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

    评论

报告相同问题?

问题事件

  • 系统已结题 11月16日
  • 创建了问题 11月8日

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题