在学习多线程的时候,我们经常要学习到多窗口售票这一经典案例,今天我们将用Python语言写一个简单易懂的售票程序,帮助大家学习理解
有以下要求:
第一、不能出现打印出现混乱
第二、比单线程快
第三、票数不能为负数
先上网上百度到的代码
import threading list_ticket = [] lock = threading.Lock() # 获取线程锁 num = 100 j = 0 for i in range(1, num + 1): ticket_num = '0' * (3 - len(str(i))) + str(i) list_ticket.append(ticket_num) def seel_ticket(k): global list_ticket global j while 1: lock.acquire() print(k, '号正在打印票') if j != 100: thre = list_ticket[j] j += 1 print(k, "号出票成功,票号为:", thre) else: print('票已经卖完') break lock.release() list_thread = [] for i in range(10): thread = threading.Thread(target=seel_ticket, args=(i + 1,)) list_thread.append(thread) for i in list_thread: i.start()
我们分析以下他的代码都是一个线程在卖票,极其不符合要求。
我上我写的源代码
# -*-coding: UTF-8 # @Time : 2021/10/17 14:55 # @Author : Cooper # @FileName: 互斥锁.py # @Software: PyCharm from threading import Thread, Lock import threading import time n = 100 mutex = Lock() def task(): global n while n > 0: mutex.acquire() # 上锁 if n > 0: n -= 1 time.sleep(0.1) print('购买成功,剩余%d 张电影票' % n, '当前的线程是:', threading.current_thread().name) else: print('票已经卖完了') break mutex.release() if __name__ == '__main__': print('主线程开始') t_l = [] for i in range(10): t = Thread(target=task) t_l.append(t) t.start() for t in t_l: t.join() print('主线程结束')运行结果如下:
但是不满意的这个程序不会自己停止,如果有大神懂的请多多指教。
当我们把互斥锁注释掉时候,输出程序出现混乱
当上锁的位置不对时候
def task(): global n mutex.acquire() # 上锁 while n > 0: if n > 0: n -= 1 time.sleep(0.1) print('购买成功,剩余%d 张电影票' % n, '当前的线程是:', threading.current_thread().name) else: print('票已经卖完了') break mutex.release()
可以看见只有一个线程在买票
我以为是我们的程序有问题,后面看了网上其他人的代码,我发现是互斥锁的问题。看如下的代码:
import threading from time import sleep, ctime N = 100 # 100张票 def Sell(name): global N while True: if N > 0: sleep(0.1) # 加入此句,可以让线程卖出第0张票或同一张票 print("{}卖出第{}张票!n".format(name, N)) N = N - 1 def main(): threads = {} for i in ("A", "B"): # 实例化每个 Thread 对象,把函数和参数传递进去,返回 Thread 实例 t = threading.Thread(target=Sell, args=(i,)) threads[i] = t # 分配线程 for i in ("A", "B"): threads[i].start() # 开始执行多线程 for i in ("A", "B"): threads[i].join() # 等待线程结束或超时,然后再往下执行 print("程序结束!") if __name__ == '__main__': main()
运行结果如下:
程序还是不会停止,就是互斥锁的问题,当我们把互斥锁注释掉之后,程序可以停止,不是逻辑问题,是互斥锁的问题。如果大佬知道如何解决,请告知。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)