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 相关文章推荐
python中mechanize库的简单使用示例
Jan 10 Python
python中执行shell命令的几个方法小结
Sep 18 Python
python快速查找算法应用实例
Sep 26 Python
Python中的面向对象编程详解(上)
Apr 13 Python
Python 删除整个文本中的空格,并实现按行显示
Jul 24 Python
Python自定义函数计算给定日期是该年第几天的方法示例
May 30 Python
django-rest-swagger对API接口注释的方法
Aug 29 Python
Python实现bilibili时间长度查询的示例代码
Jan 14 Python
Python selenium使用autoIT上传附件过程详解
May 26 Python
python爬虫实例之获取动漫截图
May 31 Python
增大python字体的方法步骤
Jul 05 Python
总结Pyinstaller打包的高级用法
Jun 28 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
40年前的这部特摄片恐龙特级克塞号80后的共同回忆
2020/03/08 日漫
PHP读取大文件的类SplFileObject使用介绍
2014/04/09 PHP
thinkPHP模板引擎用法示例
2016/12/08 PHP
PHP三种方式实现链式操作详解
2017/01/21 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
关于js获取radio和select的属性并控制的代码
2011/05/12 Javascript
js动态修改input输入框的type属性(实现方法解析)
2013/11/13 Javascript
javascript实现的平方米、亩、公顷单位换算小程序
2014/08/11 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
javascript实现俄罗斯方块游戏的思路和方法
2015/04/27 Javascript
js实现div层缓慢收缩与展开的方法
2015/05/11 Javascript
JS实现简单路由器功能的方法
2015/05/27 Javascript
js代码实现下拉菜单【推荐】
2016/12/15 Javascript
Jquery中attr与prop的区别详解
2017/05/27 jQuery
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
2017/06/29 Javascript
VUE element-ui 写个复用Table组件的示例代码
2017/11/18 Javascript
快速解决brew安装特定版本flow的问题
2018/05/17 Javascript
js实现时分秒倒计时
2019/12/03 Javascript
用Python的Flask框架结合MySQL写一个内存监控程序
2015/11/07 Python
详解python单例模式与metaclass
2016/01/15 Python
Python制作钉钉加密/解密工具
2016/12/07 Python
简单实现Python爬取网络图片
2018/04/01 Python
python画蝴蝶曲线图的实例
2019/11/21 Python
解决python中import文件夹下面py文件报错问题
2020/06/01 Python
Selenium环境变量配置(火狐浏览器)及验证实现
2020/12/07 Python
html5如何及时更新缓存文件(js、css或图片)
2013/06/24 HTML / CSS
Web时代变迁及html5与html4的区别
2016/01/06 HTML / CSS
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
什么是属性访问器
2015/10/26 面试题
代理班主任的自我评价
2014/02/04 职场文书
车辆工程专业求职信
2014/06/14 职场文书
2015年大学元旦晚会活动策划书
2014/12/09 职场文书
出生证明格式
2015/06/15 职场文书
国庆节主题班会
2015/08/15 职场文书
Pytorch GPU内存占用很高,但是利用率很低如何解决
2021/06/01 Python
Python3.10的一些新特性原理分析
2021/09/15 Python