隊列--模擬銀行服務完成程序代碼

隊列–模擬銀行服務完成程序代碼

import time, threading

class Queue:
    def __init__(self):
        self.items = []

    def isEmpty(self):
        return self.items == []

    def enqueue(self, item):
        self.items.insert(0,item)

    def dequeue(self):
        if self.items != []:
            return self.items.pop()
        else:
            return False

    def size(self):
        return len(self.items)

    def top(self):
        if self.items != []:
            return self.items[len(self.items)-1]
        else:
            return False

class Counter(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.waitQueue = Queue() ## 初始化等待的隊伍
        self.lock = threading.Lock()

    def callIng(self):
        while True:
            ### 櫃檯一直叫號,要一直循環
            time.sleep(5)
            if not self.waitQueue.isEmpty():
                self.lock.acquire()
                print("請客戶{},到{}窗口辦理業務".format(self.waitQueue.top(), threading.current_thread().name))
                self.waitQueue.dequeue()
                self.lock.release()


class bankSystem:
    def __init__(self):
        self.serviceQueue = Queue()
        self.nowNum = 0
        # self.windows = k  # 銀行櫃檯數目
        self.maxSize = 100

    def getNumber(self):
        if self.nowNum < self.maxSize:
            self.nowNum += 1
            return self.nowNum
        else:
            print("現在業務繁忙,請稍後再來")


if __name__ == "__main__":
    res = bankSystem()
    windowcount = 3
    serviceWindow = [None] * windowcount
    threadList = [None] * windowcount

    for i in range(windowcount):
        serviceWindow[i] = Counter()
        serviceWindow[i].waitQueue = res.serviceQueue
        threadList[i] = threading.Thread(name=(i + 1), target=serviceWindow[i].callIng, args=())
        threadList[i].start()
        # threadList[i].join()

    while True:
        input("請點擊觸摸屏獲取號碼:")
        # print()
        callNumber = res.getNumber()
        if res.serviceQueue != None:
            print("當前您的的號碼爲" + str(callNumber) + ",您前面還有" + str(res.serviceQueue.size()) + "個人")
            res.serviceQueue.enqueue(res.nowNum)
        else:
            print('您的號碼是:%d,您前面有 0 位' % (callNumber))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章