zoukankan      html  css  js  c++  java
  • python 多线程笔记(4)-- 车站售票模拟

    import threading
    import time
    import random
    
    class Worker(threading.Thread):
        '''售票员'''
        def __init__(self, wait_num=5, index=0):
            super().__init__()
            self.wait_num = wait_num          # 当前排队人数
            self.setName('窗口' + str(index)) # 窗口号
     
        def run(self):
            global counter, mutex
            
            while counter and self.wait_num: # 若有余票且有人排队
                # ============================
                # 窗口问询
                # ============================
                time.sleep(random.randrange(2,10)) # 比较耗时,时间随机
                
                # ============================
                # 出票
                # ============================
                mutex.acquire()         # 锁住①
                if counter == 0:        # 如果票数为0
                    mutex.release()     # 解锁③ -----> 这句很重要!!!
                    print(self.getName(), ':抱歉,票已售完')
                    break
                    
                counter = counter - 1   # 票数减一
                print('{}:当前余票 {} 张'.format(self.getName(), counter))
                mutex.release()         # 解锁③
                
                # ============================
                # 排队人数变化
                # ============================
                self.wait_num -= 1                      # 排队人数减一
                self.wait_num += random.randrange(0,2)  # 排队人数随机增加
    
        
    if __name__ == '__main__':
        # 剩余车票数
        counter = 20
        
        # 创建锁
        mutex = threading.Lock()
        
        # 开4个售票窗口
        workers = []
        for i in range(4):
            wait_num = random.randrange(2,10) # 窗口前排队人数随机
            workers.append(Worker(wait_num, i+1)) 
        
        # 开始售票
        for w in workers:
            w.start()
        
        # 阻塞主程/后台静默?自己选
        #for w in workers:
        #    w.join()
  • 相关阅读:
    「CSP-S 2019」树的重心「重心」
    「SDOI2017」天才黑客「优化建图最短路」
    「NOI Online Round2」 题解
    Qt 自定义序列化
    Android 定制化apk生成
    gradle上传jar包到maven公共仓库
    JAVA 插入注解处理器
    使用docker安装gitlab
    数据库递归树形查询优化
    JDBCTemplate使用
  • 原文地址:https://www.cnblogs.com/hhh5460/p/5178683.html
Copyright © 2011-2022 走看看