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 18 Python
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
Apr 05 Python
python调用java模块SmartXLS和jpype修改excel文件的方法
Apr 28 Python
详解Python中contextlib上下文管理模块的用法
Jun 28 Python
详解python之协程gevent模块
Jun 14 Python
Python爬虫实现简单的爬取有道翻译功能示例
Jul 13 Python
Python Cookie 读取和保存方法
Dec 28 Python
python调用百度地图WEB服务API获取地点对应坐标值
Jan 16 Python
python爬虫刷访问量 2019 7月
Aug 01 Python
通过Python实现Payload分离免杀过程详解
Jul 13 Python
python中selenium库的基本使用详解
Jul 31 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
Nov 01 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
百度ping方法使用示例 自动ping百度
2014/01/26 PHP
thinkPHP商城公告功能开发问题分析
2016/12/01 PHP
PHP PDOStatement::closeCursor讲解
2019/01/30 PHP
jquery 实现的全选和反选
2009/04/15 Javascript
如何使用Jquery获取Form表单中被选中的radio值
2013/08/09 Javascript
使用 Node.js 做 Function Test实现方法
2013/10/25 Javascript
javascript通过className来获取元素的简单示例代码
2014/01/10 Javascript
js创建表单元素并使用submit进行提交
2014/08/14 Javascript
谈谈encodeURI和encodeURIComponent以及escape的区别与应用
2015/11/24 Javascript
基于JavaScript实现瀑布流布局(二)
2016/01/26 Javascript
js获取新浪天气接口的实现代码
2016/06/06 Javascript
原生js实现ajax方法(超简单)
2016/09/20 Javascript
使用node.js中的Buffer类处理二进制数据的方法
2016/11/26 Javascript
巧用数组制作图片切换js代码
2016/11/29 Javascript
详解nodejs异步I/O和事件循环
2017/06/07 NodeJs
vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略
2019/06/04 Javascript
vue中使用elementUI组件手动上传图片功能
2019/12/13 Javascript
[41:20]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS DK
2014/05/26 DOTA
python中正则表达式的使用详解
2014/10/17 Python
python查询mysql中文乱码问题
2014/11/09 Python
浅析Python基础-流程控制
2016/03/18 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
基于python3 OpenCV3实现静态图片人脸识别
2018/05/25 Python
python实现网页自动签到功能
2019/01/21 Python
python 单线程和异步协程工作方式解析
2019/09/28 Python
wxPython之wx.DC绘制形状
2019/11/19 Python
国税会议欢迎词
2014/01/16 职场文书
护士毕业生自荐信
2014/02/07 职场文书
《秋姑娘的信》教学反思
2014/02/28 职场文书
化工操作工岗位职责
2014/04/29 职场文书
高中生旷课检讨书
2014/10/08 职场文书
法人代表资格证明书
2015/06/18 职场文书
2015小学师德工作总结
2015/07/21 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书
vue2实现provide inject传递响应式
2021/05/21 Vue.js
一篇文章告诉你如何实现Vue前端分页和后端分页
2022/02/18 Vue.js