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之入门(二)基本数据类型
May 25 Python
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
Nov 05 Python
python实现红包裂变算法
Feb 16 Python
python 时间戳与格式化时间的转化实现代码
Mar 23 Python
20招让你的Python飞起来!
Sep 27 Python
Vue的el-scrollbar实现自定义滚动
May 29 Python
Django unittest 设置跳过某些case的方法
Dec 26 Python
python 寻找离散序列极值点的方法
Jul 10 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
Aug 21 Python
Python发送手机动态验证码代码实例
Feb 28 Python
Python MySQL 日期时间格式化作为参数的操作
Mar 02 Python
jupyter notebook 添加kernel permission denied的操作
Apr 21 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
无线电广播与收音机发展的历史回眸
2021/03/02 无线电
php json_encode奇怪问题说明
2011/09/27 PHP
PHP5.5迭代生成器用法实例详解
2016/03/16 PHP
CI框架实现优化文件上传及多文件上传的方法
2017/01/04 PHP
PHP基于curl post实现发送url及相关中文乱码问题解决方法
2017/11/25 PHP
jQuery源码分析-04 选择器-Sizzle-工作原理分析
2011/11/14 Javascript
jQuery使用removeClass方法删除元素指定Class的方法
2015/03/26 Javascript
js改变embed标签src值的方法
2015/04/10 Javascript
JQuery自适应窗口大小导航菜单附源码下载
2015/09/01 Javascript
基于jquery实现省市联动效果
2015/11/23 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
jQuery条件分页 代替离线查询(附代码)
2017/08/17 jQuery
JavaScript正则表达式的贪婪匹配和非贪婪匹配
2017/09/05 Javascript
原生JS实现的简单轮播图功能【适合新手】
2018/08/17 Javascript
vue生成文件本地打开查看效果的实例
2018/09/06 Javascript
angular4笔记系列之内置指令小结
2018/11/09 Javascript
layer弹出层取消遮罩的方法
2019/09/25 Javascript
vue 在单页面应用里使用二级套嵌路由
2020/12/19 Vue.js
[01:14]2014DOTA2展望TI 剑指西雅图newbee战队专访
2014/06/30 DOTA
[37:22]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第一局
2016/02/28 DOTA
[01:00:10]完美世界DOTA2联赛PWL S2 FTD vs Inki 第二场 11.21
2020/11/24 DOTA
Python中的魔法方法深入理解
2014/07/09 Python
Python实现基本线性数据结构
2016/08/22 Python
详解用python生成随机数的几种方法
2019/08/04 Python
Python简易计算器制作方法代码详解
2019/10/31 Python
Python numpy数组转置与轴变换
2019/11/15 Python
解决python gdal投影坐标系转换的问题
2020/01/17 Python
ECHT官方网站:男女健身服
2020/02/14 全球购物
新闻专业本科生的自我评价分享
2013/11/20 职场文书
2014年心理健康教育工作总结
2014/12/06 职场文书
2014年保险业务员工作总结
2014/12/23 职场文书
2016教师给学生的毕业寄语
2015/12/04 职场文书
社会心理学学习心得体会
2016/01/22 职场文书
python控制台打印log输出重复的解决方法
2021/05/14 Python
Tomcat 与 maven 的安装与使用教程
2022/06/16 Servers