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 相关文章推荐
pycharm 使用心得(四)显示行号
Jun 05 Python
Python递归遍历列表及输出的实现方法
May 19 Python
python中偏函数partial用法实例分析
Jul 08 Python
详解Python的collections模块中的deque双端队列结构
Jul 07 Python
使用Flask集成bootstrap的方法
Jul 24 Python
python字典值排序并取出前n个key值的方法
Oct 17 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
Mar 01 Python
十分钟搞定pandas(入门教程)
Jun 21 Python
深入了解Python iter() 方法的用法
Jul 11 Python
Python中变量的输入输出实例代码详解
Jul 28 Python
如何基于Python实现数字类型转换
Feb 07 Python
Django程序的优化技巧
Apr 29 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内核介绍及扩展开发指南―基础知识
2011/09/11 PHP
php网上商城购物车设计代码分享
2012/02/15 PHP
屏蔽机器人从你的网站搜取email地址的php代码
2012/11/14 PHP
手把手教你打印出PDF(关于fpdf的简单应用)
2013/06/25 PHP
PHP中strlen()和mb_strlen()的区别浅析
2014/06/19 PHP
php结合正则批量抓取网页中邮箱地址
2015/05/19 PHP
微信开发之获取JSAPI TICKET
2017/07/07 PHP
PHP简单验证码功能机制实例详解
2019/03/27 PHP
基于JQuery的asp.net树实现代码
2010/11/30 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
js判断手机访问或者PC的几个例子(常用于手机跳转)
2015/12/15 Javascript
jquery简单倒计时实现方法
2015/12/18 Javascript
使用Promise解决多层异步调用的简单学习心得
2016/05/17 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
Javascript blur与click冲突解决办法
2017/01/09 Javascript
js 数据存储和DOM编程
2017/02/09 Javascript
分享一道关于闭包、bind和this的面试题
2017/02/20 Javascript
JavaScript之浏览器对象_动力节点Java学院整理
2017/07/03 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
JavaScript实现图片无缝滚动效果
2017/07/07 Javascript
vue实现单选和多选功能
2017/08/11 Javascript
vue中mint-ui的使用方法
2018/04/04 Javascript
微信小程序下拉框功能的实例代码
2018/11/06 Javascript
解决layui数据表格排序图标被超出的表头挤出去的问题
2019/09/19 Javascript
vue获取data数据改变前后的值方法
2019/11/07 Javascript
[03:37]2016完美“圣”典 风云人物:Mikasa专访
2016/12/07 DOTA
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
简单了解django索引的相关知识
2019/07/17 Python
基于python的selenium两种文件上传操作实现详解
2019/09/19 Python
Django ORM实现按天获取数据去重求和例子
2020/05/18 Python
python中selenium库的基本使用详解
2020/07/31 Python
HTML5实现预览本地图片
2016/02/17 HTML / CSS
iostream与iostream.h的区别
2015/01/16 面试题
优秀教师先进材料
2014/12/16 职场文书
优秀党员推荐材料
2014/12/18 职场文书
杭州黄龙洞导游词
2015/02/10 职场文书