这边文章是实现同时有车辆出去,又有车辆进来的业务逻辑,和现实的差不多

真正要和现实中的一样,只需要更改休眠时间就可,通过调节修改时间,动态实现

之前的代码

python 多线程同步锁之实现停车场业务(1)

其他学习记录 :

python 元类的学习记录

Python 的多线程(1) - 同步锁

Python 的多线程(2) - 队列

python 中的 set 放入带 list 的 tuple

以下是代码:

#!/usr/bin/env python
#                         ╭╮__╭╭╭╭╭__╭╮
#                          │           │   ╭—————╮
#                          │           │   │hello│
#                          │ ● ╭———╮ ●     │ ╭╮ │  world  │
#                          │ ≡  │● ●│  ≡     │ o╰╯ ╰—————╯
#                          │    ╰———╯     │ 
#                           ╰——┬○————┬—○╯
#                          │\____╭╭╭╭╭____/│   
#                          │              │  ╭—————————╮
#                          │    No bug      │  |  No bug|
#                          │ -       - │  ╰—————————╯
#                          │≡    o    ≡   │
#                          │           │ 
#                          ╰———┬o◤▽◥o┬———╯
#                             |  o  |
#                             |╭---╮ |
# -*- coding: utf-8 -*-
# @Time    : 2018/9/21 11:05
# @Author  : laof
# @Email   : 903900287@qq.com
# @File    : que.py
# @Software: PyCharm Community Edition"""这是一个停车场设计和实现"""#ps 关于小区停车场的设计实现级源码
#1. 小区有100个车位 ,小区有4个门口,分别是东南西北
#2. 一辆车只能占用一个车位
#3. 各个门口需要时时知道当前小区当前停车位的剩余数量
#4. 各个门口需要知道哪个位置被占用了,好分配等待的车辆进入import queue, threading
import random, time
from enum import Enum#定义停车位 队列,假设现在是晚上休息时间,停车场只进不出(没有要出去的车辆)
#这里是生产者的定义,只不过这个生产者是不变的
parkingLots = queue.Queue(100) #总共100个空车位#已被使用的停车位的队列
useParkingLots = queue.Queue(100)# 4个方向新增的车辆的队列(默认给个大点的值吧)
appendCarQueue = queue.Queue(100*100)#在4个门添加的新的等待车辆的队列
addCarQueue = queue.Queue(100*10)#通知消息的队列,这里假设我们的闸口屏幕能够显示的这么多
informs = queue.Queue(200)# 其实这里面放的就是已经被使用的车位的记录#定义东南西北4个门口
GeteDirectionEnum = Enum("GeteDirectionEnum",("东","西","南","北"))def put_all():for x in range(40):parkingLots.put("车位{0}号".format(x+1))#添加一些新车
def put_some_car():y = 0while True:y += 1time.sleep(6)addCarQueue.put("【{0}】新的车辆{1}".format(random.randint(4, 100)%4, y))#定义同步锁
gateLock = threading.Lock()#定义消费者(可以看作是4个门口的闸口,一闸一车)
class Gate(threading.Thread):def __init__(self, name, car_num):threading.Thread.__init__(self)self.__name = name  # 门口名字self.__carNum = car_num  #门口车子等待进入数量print("-{0}门-的闸口开始使用,门外等待数量{1}!".format(self.__name,self.__carNum))def run(self):self.open_gate()# 打开闸口放下一辆车辆进入def open_gate(self):"""开闸口"""sur = self.__carNumif not parkingLots.empty(): #如果停车场已经没有空车位了while not parkingLots.empty():try:gateLock.acquire() # 获得锁if not parkingLots.empty():if not appendCarQueue.empty():sur += 1   #如果发现有新车进来就在随机挺某一个门口吧informs.put("*************************>{0}门的排队的车辆新增了一辆,""新增后该门排队剩余数量为{1},最前面的一辆即将进入停车场,停车场的总空位数为{2}".format(self.__name,sur,parkingLots.qsize()))if not sur:informs.put("=========================>{0}门的排队车辆,已经全部进入停车场".format(self.__name))gateLock.release()# 释放锁breaksur -= 1place = parkingLots.get() # 获取停车位,并让一辆车子进去useParkingLots.put(place) # 放入已经被使用停车位列表time.sleep(1)   # 这里等待x秒,模拟车辆缴费刷卡进入停车场这个过程informs.put("【{0}】已经被{2}门使用,剩余停车位数量【{1}】个,---{2}门剩余排队车辆【{3}】辆".format(place,parkingLots.qsize(),self.__name,sur))#放入通知队列if parkingLots.qsize()==0:informs.put("【{0}】门 发现 停车位已经用完了,等待6秒,看还有没有车子出去".format(self.__name))time.sleep(5)gateLock.release()  # 释放锁except Exception as e:gateLock.release() #如果出现了异常一定要释放锁if parkingLots.empty(): # 通知所有门口,告知停车位已经用完了informs.put("1尊敬的业主您好,本小区中已经没有停车位了,请到周围转转看吧!{0}".format(self.__name))else:informs.put("2尊敬的业主您好,本小区中已经没有停车位了,请到周围转转看吧!")#定义车辆离开停车场的类
class LeaveThread(threading.Thread):"""车辆离开停车场的类"""def __init__(self):threading.Thread.__init__(self)def run(self):self.leave_from()@staticmethoddef leave_from():time.sleep(1)#这里就一个线程就不用加锁了while not useParkingLots.empty() and not parkingLots.full():time.sleep(4) #每8秒有一辆车离开nnn = useParkingLots.get()parkingLots.put(nnn)appendCarQueue.put(nnn)#这里为了方便假装,刚离开的车子转了一个圈又转回来了吧informs.put("【======={0}已空闲,当前剩余空车位数量位【{1}】========】".format(nnn,parkingLots.qsize()))# 开始定义主函数入口def show_log():"""显示停车位的信息"""n = 0while 1:n += 1#time.sleep(3)print(n, "-----", informs.get())if parkingLots.empty() and informs.empty() and useParkingLots.empty():breakif __name__ == "__main__":put_all()threads = []#启动一个线程,时时输出停车位的信息t = threading.Thread(target=show_log, name='carLogThread')t.start()#启动一个线程,离开某几辆车子leaveThread = LeaveThread()leaveThread.start()sum = 0# 循环 枚举,同时开始4个门口放行车辆for n, member in GeteDirectionEnum.__members__.items():if member.value == 4:x = parkingLots.qsize()-sumgate = Gate(n, x)threads.append(gate)breakx = random.randint(5,15)sum = sum + xgate = Gate(n, x)threads.append(gate)#同时启动for i,gate in enumerate(threads):gate.start()#等待所有的线程完毕for gate in threads:gate.join()t.join()print("已经夜深人静了,没有车辆进来的可以回家睡觉了")leaveThread.join()

转载于:https://my.oschina.net/u/2322277/blog/2218648

python 多线程同步锁之实现停车场业务(2)相关推荐

  1. python停车场_python 多线程同步锁之实现停车场业务 (1)

    好久没用Python,最近复习了一下,写一个停车场的实现 ,代码如下,所有的需求实现都在注释中 ** show code** #!/usr/bin/env python # ╭╮__╭╭╭╭╭__╭╮ ...

  2. python 多线程同步_Python利用多线程同步锁实现多窗口订票系统(推荐)

    利用Python实现多窗口订票系统,利用 threading.Lock() 避免出现一票多卖,无票也卖的情况,并规范化输出情况. 代码: import threading import time ti ...

  3. python多线程同步

    python多线程同步 作者:vpoet 日期:大约在夏季 1 import threading 2 import time 3 mylock = threading.RLock() 4 num=0 ...

  4. python 线程安全的数据类型_详解python多线程、锁、event事件机制的简单使用

    详解python多线程.锁.event事件机制的简单使用 发布时间:2020-09-25 02:04:12 来源:脚本之家 阅读:117 作者:君惜 线程和进程 1.线程共享创建它的进程的地址空间,进 ...

  5. python线程同步锁_Python实现的多线程同步与互斥锁功能示例

    本文实例讲述了Python实现的多线程同步与互斥锁功能.分享给大家供大家参考,具体如下: #! /usr/bin/env python #coding=utf-8 import threading i ...

  6. java多线程--同步锁、

    同步代码块: 语法: synchronized(同步锁) { 需要同步操作的代码 } --------------------------------------------------- 同步锁: ...

  7. python多线程同步与互斥_python多线程编程(3): 使用互斥锁同步线程

    问题的提出 上一节的例子中,每个线程互相独立,相互之间没有任何关系.现在假设这样一个例子:有一个全局的计数num,每个线程获取这个全局的计数,根据num进行一些处理,然后将num加1.很容易写出这样的 ...

  8. Python多线程同步、互斥锁、死锁

    接着上篇多线程继续讲,上篇最后的多线程共享全局变量对变量的处理值出错在本文中给出解决方案. 出现这个情况的原因是在python解释器中GIL全局解释器锁. GIL:全局解释器锁,每个线程在执行的过程都 ...

  9. python多线程,线程锁

    python使用多线程, 不一定运行速度快,这里引入GIL(global interpreter lock) python解释器中任意时刻都只有一个线程在执行; GIL执行过程: 1). 设置一个GI ...

最新文章

  1. 谷歌扔下芯片核弹:开源全球首个可制造的PDK,免费帮有缘人实现造芯梦想
  2. .NET业务实体类验证组件Fluent Validation
  3. Android 拉伸四周空白,中间内容不变的9Patch
  4. PHP伪类型和伪变量
  5. QT的QCheckBox类的使用
  6. Kali渗透测试技术实战
  7. 【unity3d--初始学习五--c#脚本对xml文件的创建和解析】
  8. ES6-8 - 函数名/对象拓展、描述符、getter/setter
  9. 使用WildFly和Java EE 7映像与Docker提供者一起流浪
  10. iis6 配置python CGI
  11. 【leetcodeMySQL每周一练】- 5道题带你练习mysql
  12. SpringMVC当中的 @Transactional(readOnly = true) 的作用
  13. python3 三级菜单-基础版
  14. linux之使用grep搜索文本
  15. UVA11752 The Super Powers —— 数论、枚举技巧
  16. C/C++ 计算程序运行时间的代码
  17. 大数据技术原理与应用-林子雨版-课后习题答案
  18. dwg格式的计算机图,例举电脑dwg文件怎么打开
  19. 一个关于数学归纳法的悖论问题
  20. maven镜像源及代理配置

热门文章

  1. 通过哪些方法可以查看对手的Facebook广告信息?
  2. 解决LaTeX英文字体加粗失效、无法加粗问题
  3. 英特尔张宇:用“芯”深耕智能制造,聚力构筑可持续未来
  4. Discuz! X3.2 在帖子标题显示分类信息中的某个字段内容的实现方法
  5. 第一次电话面试经历居然是阿里
  6. 类似一个木函的app 实用工具箱
  7. ev3pid巡线_【 EV3基础应用 】课题六:PID巡线的P,到底是什么?
  8. Vue packages version mismatch 报错解决方法
  9. Microsoft Excel 教程:如何在 Excel 中进行数学运算?
  10. 自从有了这位“小绅士”,随时随地都能K歌丨钛空舱