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 del()函数用法
Mar 24 Python
Python基于二分查找实现求整数平方根的方法
May 12 Python
Python处理PDF及生成多层PDF实例代码
Apr 24 Python
python读出当前时间精度到秒的代码
Jul 05 Python
python实现两个经纬度点之间的距离和方位角的方法
Jul 05 Python
OpenCV 边缘检测
Jul 10 Python
对Django中的权限和分组管理实例讲解
Aug 16 Python
pycharm 更改创建文件默认路径的操作
Feb 15 Python
python由已知数组快速生成新数组的方法
Apr 08 Python
浅谈python处理json和redis hash的坑
Jul 16 Python
详解Python yaml模块
Sep 23 Python
利用Python+OpenCV三步去除水印
May 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
深入理解PHP之数组(遍历顺序)  Laruence原创
2012/06/13 PHP
php中判断文件存在是用file_exists还是is_file的整理
2012/09/12 PHP
PHP基础教程(php入门基础教程)一些code代码
2013/01/06 PHP
PHP解析RSS的方法
2015/03/05 PHP
thinkphp分页实现效果
2016/10/13 PHP
地震发生中逃生十大法则
2008/05/12 Javascript
js 设置选中行的样式的实现代码
2010/05/24 Javascript
各情景下元素宽高的获取实现代码
2011/09/13 Javascript
JavaScript中的对象的extensible属性介绍
2014/12/30 Javascript
js进行表单验证实例分析
2015/02/10 Javascript
jquery延迟对象解析
2016/10/26 Javascript
利用js给datalist或select动态添加option选项的方法
2018/01/25 Javascript
Hexo已经看腻了,来手把手教你使用VuePress搭建个人博客
2018/04/26 Javascript
leaflet加载geojson叠加显示功能代码
2020/02/21 Javascript
jquery轮播图插件使用方法详解
2020/07/31 jQuery
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
详解Python网络爬虫功能的基本写法
2016/01/28 Python
Python 中迭代器与生成器实例详解
2017/03/29 Python
python3实现全角和半角字符转换的方法示例
2017/09/21 Python
python如何把嵌套列表转变成普通列表
2018/03/20 Python
python导入模块交叉引用的方法
2019/01/19 Python
详解Python 调用C# dll库最简方法
2019/06/20 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
Django 实现外键去除自动添加的后缀‘_id’
2019/11/15 Python
Python sqlite3查询操作过程解析
2020/02/20 Python
Django日志及中间件模块应用案例
2020/09/10 Python
介绍一下.NET构架下remoting和webservice
2014/05/08 面试题
爱岗敬业演讲稿范文
2014/01/14 职场文书
会计专业大学生职业生涯规划书
2014/02/11 职场文书
运动会入场词50字
2014/02/20 职场文书
付款委托书范本
2014/04/04 职场文书
单位活动策划方案
2014/08/17 职场文书
居安思危观后感
2015/06/11 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
python获取带有返回值的多线程
2022/05/02 Python