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()

最新文章

  1. PHP_SELF、 SCRIPT_NAME、 REQUEST_URI区别
  2. CodeTimerPerformance EasyPerformanceCounterHelper .NET 4.5
  3. ASP.net解析JSON例子
  4. Aspose 强大的服务器端 excel word ppt pdf 处理工具
  5. C#中TreeView与数据库绑定
  6. 第二sprint总结
  7. HDU1850 Being a Good Boy in Spring Festival(博弈)
  8. 第二篇:python高级之装饰器
  9. JS--switch 语句
  10. python pdb 调试
  11. 工厂方法模式--java代码实现
  12. Ubuntu VIM下实现python自动缩进
  13. django的url反向解析
  14. sed命令替换目录
  15. [C#] LINQ之SelectMany
  16. mybatis打印SQL日志
  17. swap的实现(没有中间变量)
  18. android-------开发常用框架汇总
  19. Vue2.5开发去哪儿网App 城市列表开发之 兄弟组件间联动及列表性能优化
  20. unbtu使用笔记

热门文章

  1. WEB测试—兼容测试
  2. 【转】Java做服务器开发语言
  3. PAT——1071. 小赌怡情
  4. ovs的卸载删除
  5. Redmine使用学习
  6. git删除本地保存的账号和密码
  7. Oracle 存储结构二
  8. Objective-C 之深拷贝和浅拷贝
  9. Ionic3项目实践记录
  10. Linux vi编辑器使用技巧