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 相关文章推荐
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
Feb 24 Python
Eclipse中Python开发环境搭建简单教程
Mar 23 Python
python读文件保存到字典,修改字典并写入新文件的实例
Apr 23 Python
python实现批量解析邮件并下载附件
Jun 19 Python
在cmd中查看python的安装路径方法
Jul 03 Python
Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法
Jul 04 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
Jan 19 Python
利用 Python ElementTree 生成 xml的实例
Mar 06 Python
python实现梯度下降法
Mar 24 Python
通过代码简单了解django model序列化作用
Nov 12 Python
python中random模块详解
Mar 01 Python
Python使用pandas导入csv文件内容的示例代码
Dec 24 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
教你在PHPStorm中配置Xdebug
2015/07/27 PHP
PHP实现的ID混淆算法类与用法示例
2018/08/10 PHP
PHP实现八皇后算法
2019/05/06 PHP
javascript下4个跨浏览器必备的函数
2010/03/07 Javascript
javascript cookie操作类的实现代码小结附使用方法
2010/06/02 Javascript
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
2010/06/28 Javascript
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
JQuery for与each性能比较分析
2013/05/14 Javascript
20行代码实现的一个CSS覆盖率测试脚本
2013/07/07 Javascript
js里取容器大小、定位、距离等属性搜集整理
2013/08/19 Javascript
JavaScript splice()方法详解
2020/09/22 Javascript
JQuery实现样式设置、追加、移除与切换的方法
2015/06/11 Javascript
基于RequireJS和JQuery的模块化编程——常见问题全面解析
2016/04/14 Javascript
js实现页面a向页面b传参的方法
2016/05/29 Javascript
js cookie实现记住密码功能
2017/01/17 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
vue父组件通过props如何向子组件传递方法详解
2017/08/16 Javascript
vue 实现类似淘宝星级评分的示例
2018/03/01 Javascript
基于JS开发微信网页录音功能的实例代码
2019/04/30 Javascript
[00:38]TI珍贵瞬间系列(二):笑
2020/08/26 DOTA
python base64 decode incorrect padding错误解决方法
2015/01/08 Python
python多任务及返回值的处理方法
2019/01/22 Python
win10下安装Anaconda的教程(python环境+jupyter_notebook)
2019/10/23 Python
python实现数据清洗(缺失值与异常值处理)
2019/12/02 Python
flask框架自定义url转换器操作详解
2020/01/25 Python
Ashford台湾:以折扣价提供奢华的男女用表款
2019/12/04 全球购物
意大利网上购书网站:Libraccio.it
2021/02/03 全球购物
高三毕业生自我鉴定
2013/12/20 职场文书
中学生爱国演讲稿
2013/12/31 职场文书
超市开店计划书
2014/04/26 职场文书
2014年党建工作汇报材料
2014/11/02 职场文书
求职自我评价范文
2015/03/09 职场文书
青涩记忆观后感
2015/06/18 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书
Spring Bean是如何初始化的详解
2022/03/22 Java/Android
css3手动实现pc端横向滚动
2022/06/21 HTML / CSS