当前位置 主页 > 网站技术 > 代码类 >

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

    栏目:代码类 时间:2019-12-22 15:09

    利用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 张