python 多线程笔记(4)-- 车站售票模拟
2024-08-29 07:38:33
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()
最新文章
- PHP_SELF、 SCRIPT_NAME、 REQUEST_URI区别
- CodeTimerPerformance EasyPerformanceCounterHelper .NET 4.5
- ASP.net解析JSON例子
- Aspose 强大的服务器端 excel word ppt pdf 处理工具
- C#中TreeView与数据库绑定
- 第二sprint总结
- HDU1850 Being a Good Boy in Spring Festival(博弈)
- 第二篇:python高级之装饰器
- JS--switch 语句
- python pdb 调试
- 工厂方法模式--java代码实现
- Ubuntu VIM下实现python自动缩进
- django的url反向解析
- sed命令替换目录
- [C#] LINQ之SelectMany
- mybatis打印SQL日志
- swap的实现(没有中间变量)
- android-------开发常用框架汇总
- Vue2.5开发去哪儿网App 城市列表开发之 兄弟组件间联动及列表性能优化
- unbtu使用笔记