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 相关文章推荐
matplotlib调整子图间距,调整整体空白的方法
Aug 03 Python
python读取文件名并改名字的实例
Jan 07 Python
[机器视觉]使用python自动识别验证码详解
May 16 Python
基于sklearn实现Bagging算法(python)
Jul 11 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
Sep 11 Python
python取均匀不重复的随机数方式
Nov 27 Python
python循环嵌套的多种使用方法解析
Nov 29 Python
关于numpy.where()函数 返回值的解释
Dec 06 Python
sklearn和keras的数据切分与交叉验证的实例详解
Jun 19 Python
python实现单机五子棋
Aug 28 Python
python自动化调用百度api解决验证码
Apr 13 Python
教你使用Python pypinyin库实现汉字转拼音
May 27 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
强烈推荐:php.ini中文版(2)
2006/10/09 PHP
PHP文件打开、关闭、写入的判断与执行代码
2011/05/24 PHP
常用的PHP数据库操作方法(MYSQL版)
2011/06/08 PHP
php 获取SWF动画截图示例代码
2014/02/10 PHP
PHP 快速排序算法详解
2014/11/10 PHP
PHP面试题之文件目录操作
2015/10/15 PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
2016/09/14 PHP
Laravel重写用户登录简单示例
2016/10/08 PHP
jquery中通过过滤器获取表单元素的实现代码
2011/07/05 Javascript
JQuery通过Ajax提交表单并返回结果
2011/07/31 Javascript
基于JQuery的一句话搞定手风琴菜单
2012/09/14 Javascript
js控制表单奇偶行样式的简单方法
2013/07/31 Javascript
面向切面编程(AOP)的理解
2015/05/01 Javascript
JavaScript中判断函数、变量是否存在
2015/06/10 Javascript
javascript从定义到执行 你不知道的那些事
2016/01/04 Javascript
javascript实现平滑无缝滚动
2020/08/09 Javascript
Bootstrap学习笔记之css样式设计(1)
2016/06/07 Javascript
浅谈js和css内联外联注意事项
2016/06/30 Javascript
JavaScript实现倒计时跳转页面功能【实用】
2016/12/13 Javascript
ES6概念 Symbol toString()方法
2016/12/25 Javascript
Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法
2017/12/23 Javascript
vue cli构建的项目中请求代理与项目打包问题
2018/02/26 Javascript
layui内置模块layim发送图片添加加载动画的方法
2019/09/23 Javascript
如何利用JavaScript编写更好的条件语句详解
2020/08/10 Javascript
python操作ie登陆土豆网的方法
2015/05/09 Python
基于python 处理中文路径的终极解决方法
2018/04/12 Python
Python实现正则表达式匹配任意的邮箱方法
2018/12/20 Python
Python如何使用27行代码绘制星星图
2020/07/20 Python
python如何快速拼接字符串
2020/10/28 Python
CSS3制作缩略图的详细过程
2016/07/08 HTML / CSS
MyFrenchPharma中文网:最大的法国药妆平台
2016/10/07 全球购物
Carter’s官方旗舰店:美国受欢迎的婴童服装品牌
2018/01/21 全球购物
Top Villas美国:豪华别墅出租和度假屋
2018/07/10 全球购物
《鸟岛》教学反思
2014/04/26 职场文书
司机工作自我鉴定
2014/09/19 职场文书
「女孩的钓鱼慢活」全新版权绘公布
2022/03/21 日漫