好久没用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