Python利用多线程同步锁实现多窗口订票系统(推荐)


Posted in Python onDecember 22, 2019

利用Python实现多窗口订票系统,利用

threading.Lock()

避免出现一票多卖,无票也卖的情况,并规范化输出情况。

代码:

import threading
import time
tickets, lock = 20, threading.Lock()
class TicketWindows(threading.Thread):
 def __init__(self, window_name):
  threading.Thread.__init__(self)
  self.window_name = window_name
 def run(self):
  sell_tickets(self.window_name)
def sell_tickets(threadName):
 global tickets
 while tickets > 0:
  lock.acquire() # 加一个同步锁,类似Java中的synchronized
  if tickets > 0:
   print(threadName, "准备出票,还剩余票:", tickets, "张")
   tickets -= 1
   print(threadName, "卖出1张车票,还剩:", tickets, "张")
   print("----------------------------------")
  else:
   print("车票售空!")
  lock.release() # 释放同步锁
  try:
   time.sleep(1)
  except RuntimeError:
   print("error!")
if __name__ == '__main__':
 window1 = TicketWindows("窗口1")
 window2 = TicketWindows("窗口2")
 window3 = TicketWindows("窗口3")
 window1.start()
 window2.start()
 window3.start()
 window1.join()
 window2.join()
 window3.join()
 print("退出主线程")

输出:

窗口1 准备出票,还剩余票: 20 张
窗口1 卖出1张车票,还剩: 19 张
----------------------------------
窗口2 准备出票,还剩余票: 19 张
窗口2 卖出1张车票,还剩: 18 张
----------------------------------
窗口3 准备出票,还剩余票: 18 张
窗口3 卖出1张车票,还剩: 17 张
----------------------------------
窗口2 准备出票,还剩余票: 17 张
窗口2 卖出1张车票,还剩: 16 张
----------------------------------
窗口3 准备出票,还剩余票: 16 张
窗口3 卖出1张车票,还剩: 15 张
----------------------------------
窗口1 准备出票,还剩余票: 15 张
窗口1 卖出1张车票,还剩: 14 张
----------------------------------
窗口3 准备出票,还剩余票: 14 张
窗口3 卖出1张车票,还剩: 13 张
----------------------------------
窗口1 准备出票,还剩余票: 13 张
窗口1 卖出1张车票,还剩: 12 张
----------------------------------
窗口2 准备出票,还剩余票: 12 张
窗口2 卖出1张车票,还剩: 11 张
----------------------------------
窗口1 准备出票,还剩余票: 11 张
窗口1 卖出1张车票,还剩: 10 张
----------------------------------
窗口3 准备出票,还剩余票: 10 张
窗口3 卖出1张车票,还剩: 9 张
----------------------------------
窗口2 准备出票,还剩余票: 9 张
窗口2 卖出1张车票,还剩: 8 张
----------------------------------
窗口1 准备出票,还剩余票: 8 张
窗口1 卖出1张车票,还剩: 7 张
----------------------------------
窗口3 准备出票,还剩余票: 7 张
窗口3 卖出1张车票,还剩: 6 张
----------------------------------
窗口2 准备出票,还剩余票: 6 张
窗口2 卖出1张车票,还剩: 5 张
----------------------------------
窗口1 准备出票,还剩余票: 5 张
窗口1 卖出1张车票,还剩: 4 张
----------------------------------
窗口2 准备出票,还剩余票: 4 张
窗口2 卖出1张车票,还剩: 3 张
----------------------------------
窗口3 准备出票,还剩余票: 3 张
窗口3 卖出1张车票,还剩: 2 张
----------------------------------
窗口1 准备出票,还剩余票: 2 张
窗口1 卖出1张车票,还剩: 1 张
----------------------------------
窗口3 准备出票,还剩余票: 1 张
窗口3 卖出1张车票,还剩: 0 张
----------------------------------

车票售空!

退出主线程

注意:使用 synchronized 修饰run()方法是无效的!这会导致自始至终只有一个窗口进行卖票操作!

总结

以上所述是小编给大家介绍的Python利用多线程同步锁实现多窗口订票系统,希望对大家有所帮助!

Python 相关文章推荐
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
Jun 25 Python
用Python抢过年的火车票附源码
Dec 07 Python
Python Paramiko模块的安装与使用详解
Nov 18 Python
Python机器学习之决策树算法实例详解
Dec 06 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
Jan 04 Python
磁盘垃圾文件清理器python代码实现
Aug 24 Python
Python WSGI的深入理解
Aug 01 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
Django Rest framework之权限的实现示例
Dec 17 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
Jul 07 Python
python实现测试工具(二)——简单的ui测试工具
Oct 19 Python
matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
Jan 05 Python
python使用正则来处理各种匹配问题
Dec 22 #Python
Python中base64与xml取值结合问题
Dec 22 #Python
python操作cfg配置文件方式
Dec 22 #Python
python实现局域网内实时通信代码
Dec 22 #Python
python 解决flask uwsgi 获取不到全局变量的问题
Dec 22 #Python
Python调用scp向服务器上传文件示例
Dec 22 #Python
python 通过手机号识别出对应的微信性别(实例代码)
Dec 22 #Python
You might like
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
在服务端进行目录建立、删除,文件上传、删除的过程的php代码
2008/09/10 PHP
使用php+Ajax实现唯一校验实现代码[简单应用]
2011/11/29 PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
2012/12/11 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
2014/08/21 PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
2015/02/10 PHP
JS的递增/递减运算符和带操作的赋值运算符的等价式
2007/12/08 Javascript
jQuery EasyUI 的EasyLoader功能介绍
2010/09/12 Javascript
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
2011/08/28 Javascript
Javascript Ajax异步读取RSS文档具体实现
2013/12/12 Javascript
jquery教程ajax请求json数据示例
2014/01/13 Javascript
Jquery遍历节点的方法小集
2014/01/22 Javascript
Node.js中require的工作原理浅析
2014/06/24 Javascript
AngularJS教程 ng-style 指令简单示例
2016/08/03 Javascript
微信小程序 wxapp画布 canvas详细介绍
2016/10/31 Javascript
js调用父框架函数与弹窗调用父页面函数的简单方法
2016/11/01 Javascript
bootstrapValidator自定验证方法写法
2016/12/01 Javascript
Sequelize中用group by进行分组聚合查询
2016/12/12 Javascript
Web前端框架Angular4.0.0 正式版发布
2017/03/28 Javascript
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
微信小程序云开发实现数据添加、查询和分页
2019/05/17 Javascript
vue input输入框关键字筛选检索列表数据展示
2020/10/26 Javascript
微信小程序接入腾讯云验证码的方法步骤
2020/01/07 Javascript
vue实现带过渡效果的下拉菜单功能
2020/02/19 Javascript
基于vue实现简易打地鼠游戏
2020/08/21 Javascript
[01:12](回顾)DOTA2国际邀请赛,全世界DOTAer的盛宴
2014/07/01 DOTA
[30:51]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第一局
2016/03/04 DOTA
12步教你理解Python装饰器
2016/02/25 Python
机器学习python实战之手写数字识别
2017/11/01 Python
在python中只选取列表中某一纵列的方法
2018/11/28 Python
Python一键安装全部依赖包的方法
2019/08/12 Python
2015年酒店年度工作总结
2015/05/23 职场文书
利用For循环遍历Python字典的三种方法实例
2022/03/25 Python
如何Tomcat中使用ipv6地址
2022/05/06 Servers
Apache SeaTunnel实现 非CDC数据抽取
2022/05/20 Servers
MySQL数据库配置信息查看与修改方法详解
2022/06/25 MySQL