好久没用Python,最近复习了一下,写一个停车场的实现 ,代码如下,所有的需求实现都在注释中
** show code**
#!/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个空车位
#通知消息的队列,这里假设我们的闸口屏幕能够显示的这么多
informs = queue.Queue(200)# 其实这里面放的就是已经被使用的车位的记录
#定义东南西北4个门口
GeteDirectionEnum = Enum("GeteDirectionEnum",("东","西","南","北"))
def put_all():
for x in range(40):
parkingLots.put("车位{0}号".format(x+1))
#定义同步锁
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.__carNum
if not parkingLots.empty(): #如果停车场已经没有空车位了
while not parkingLots.empty():
try:
gateLock.acquire() # 获得锁
if not parkingLots.empty():
if not sur:
informs.put("=========================>{0}门的排队车辆,已经全部进入停车场".format(self.__name))
gateLock.release()# 释放锁
break
sur -= 1
place = parkingLots.get() # 获取停车位,并让一辆车子进去
time.sleep(1)# 这里等待x秒,模拟车辆缴费刷卡进入停车场这个过程
informs.put("【{0}】已经被{2}门使用,剩余停车位数量【{1}】个,---{2}门剩余排队车辆【{3}】辆"
.format(place,parkingLots.qsize(),self.__name,sur))#放入通知队列
gateLock.release()# 释放锁
except Exception as e:
gateLock.release() #如果出现了异常一定要释放锁
if parkingLots.empty(): # 通知所有门口,告知停车位已经用完了
informs.put("1尊敬的业主您好,本小区中已经没有停车位了,请到周围转转看吧!{0}".format(self.__name))
else:
informs.put("2尊敬的业主您好,本小区中已经没有停车位了,请到周围转转看吧!")
# 开始定义主函数入口
def show_log():
"""显示停车位的信息"""
n = 0
while True:
n += 1
#time.sleep(3)
print(n, "-----", informs.get())
if __name__ == "__main__":
put_all()
threads = []
#启动一个线程,时时输出停车位的信息
t = threading.Thread(target=show_log, name='carLogThread')
t.start()
sum = 0
# 循环 枚举,同时开始4个门口放行车辆
for n, member in GeteDirectionEnum.__members__.items():
if member.value == 4:
x = parkingLots.qsize()-sum
gate = Gate(n, x)
threads.append(gate)
break
x = random.randint(5,15)
sum = sum + x
gate = Gate(n, x)
threads.append(gate)
#同时启动
for i,gate in enumerate(threads):
print("i==>",i)
gate.start()
#等待所有的线程完毕
for gate in threads:
gate.join()
t.join()
print("已经夜深人静了,没有车辆进来的可以回家睡觉了")
输出结果
F:\install\python\python.exe G:/work/python-project/py-demo/demo1/que.py
-东门-的闸口开始使用,门外等待数量10!
-西门-的闸口开始使用,门外等待数量7!
-南门-的闸口开始使用,门外等待数量9!
-北门-的闸口开始使用,门外等待数量14!
i==> 0
i==> 1
i==> 2
i==> 3
1 ----- 【车位1号】已经被东门使用,剩余停车位数量【39】个,---东门剩余排队车辆【9】辆
2 ----- 【车位2号】已经被西门使用,剩余停车位数量【38】个,---西门剩余排队车辆【6】辆
3 ----- 【车位3号】已经被西门使用,剩余停车位数量【37】个,---西门剩余排队车辆【5】辆
4 ----- 【车位4号】已经被西门使用,剩余停车位数量【36】个,---西门剩余排队车辆【4】辆
5 ----- 【车位5号】已经被西门使用,剩余停车位数量【35】个,---西门剩余排队车辆【3】辆
6 ----- 【车位6号】已经被西门使用,剩余停车位数量【34】个,---西门剩余排队车辆【2】辆
7 ----- 【车位7号】已经被西门使用,剩余停车位数量【33】个,---西门剩余排队车辆【1】辆
8 ----- 【车位8号】已经被东门使用,剩余停车位数量【32】个,---东门剩余排队车辆【8】辆
9 ----- 【车位9号】已经被东门使用,剩余停车位数量【31】个,---东门剩余排队车辆【7】辆
10 ----- 【车位10号】已经被东门使用,剩余停车位数量【30】个,---东门剩余排队车辆【6】辆
11 ----- 【车位11号】已经被东门使用,剩余停车位数量【29】个,---东门剩余排队车辆【5】辆
12 ----- 【车位12号】已经被东门使用,剩余停车位数量【28】个,---东门剩余排队车辆【4】辆
13 ----- 【车位13号】已经被东门使用,剩余停车位数量【27】个,---东门剩余排队车辆【3】辆
14 ----- 【车位14号】已经被东门使用,剩余停车位数量【26】个,---东门剩余排队车辆【2】辆
15 ----- 【车位15号】已经被东门使用,剩余停车位数量【25】个,---东门剩余排队车辆【1】辆
16 ----- 【车位16号】已经被东门使用,剩余停车位数量【24】个,---东门剩余排队车辆【0】辆
17 ----- =========================>东门的排队车辆,已经全部进入停车场
18 ----- 【车位17号】已经被西门使用,剩余停车位数量【23】个,---西门剩余排队车辆【0】辆
19 ----- =========================>西门的排队车辆,已经全部进入停车场
20 ----- 【车位18号】已经被南门使用,剩余停车位数量【22】个,---南门剩余排队车辆【8】辆
21 ----- 【车位19号】已经被南门使用,剩余停车位数量【21】个,---南门剩余排队车辆【7】辆
22 ----- 【车位20号】已经被南门使用,剩余停车位数量【20】个,---南门剩余排队车辆【6】辆
23 ----- 【车位21号】已经被南门使用,剩余停车位数量【19】个,---南门剩余排队车辆【5】辆
24 ----- 【车位22号】已经被南门使用,剩余停车位数量【18】个,---南门剩余排队车辆【4】辆
25 ----- 【车位23号】已经被南门使用,剩余停车位数量【17】个,---南门剩余排队车辆【3】辆
26 ----- 【车位24号】已经被南门使用,剩余停车位数量【16】个,---南门剩余排队车辆【2】辆
27 ----- 【车位25号】已经被南门使用,剩余停车位数量【15】个,---南门剩余排队车辆【1】辆
28 ----- 【车位26号】已经被南门使用,剩余停车位数量【14】个,---南门剩余排队车辆【0】辆
29 ----- =========================>南门的排队车辆,已经全部进入停车场
30 ----- 【车位27号】已经被北门使用,剩余停车位数量【13】个,---北门剩余排队车辆【13】辆
31 ----- 【车位28号】已经被北门使用,剩余停车位数量【12】个,---北门剩余排队车辆【12】辆
32 ----- 【车位29号】已经被北门使用,剩余停车位数量【11】个,---北门剩余排队车辆【11】辆
33 ----- 【车位30号】已经被北门使用,剩余停车位数量【10】个,---北门剩余排队车辆【10】辆
34 ----- 【车位31号】已经被北门使用,剩余停车位数量【9】个,---北门剩余排队车辆【9】辆
35 ----- 【车位32号】已经被北门使用,剩余停车位数量【8】个,---北门剩余排队车辆【8】辆
36 ----- 【车位33号】已经被北门使用,剩余停车位数量【7】个,---北门剩余排队车辆【7】辆
37 ----- 【车位34号】已经被北门使用,剩余停车位数量【6】个,---北门剩余排队车辆【6】辆
38 ----- 【车位35号】已经被北门使用,剩余停车位数量【5】个,---北门剩余排队车辆【5】辆
39 ----- 【车位36号】已经被北门使用,剩余停车位数量【4】个,---北门剩余排队车辆【4】辆
40 ----- 【车位37号】已经被北门使用,剩余停车位数量【3】个,---北门剩余排队车辆【3】辆
41 ----- 【车位38号】已经被北门使用,剩余停车位数量【2】个,---北门剩余排队车辆【2】辆
42 ----- 【车位39号】已经被北门使用,剩余停车位数量【1】个,---北门剩余排队车辆【1】辆
43 ----- 【车位40号】已经被北门使用,剩余停车位数量【0】个,---北门剩余排队车辆【0】辆
44 ----- 1尊敬的业主您好,本小区中已经没有停车位了,请到周围转转看吧!北
这里仅仅是实现了车库只进不出的逻辑,下面会 同时有进有出的实现
其他学习记录 :
python 元类的学习记录
Python 的多线程(1) - 同步锁
Python 的多线程(2) - 队列
python 中的 set 放入带 list 的 tuple