Python 多线程卖票问题
在学习多线程的时候,我们经常要学习到多窗口售票这一经典案例,今天我们将用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()
运行结果如下:
程序还是不会停止,就是互斥锁的问题,当我们把互斥锁注释掉之后,程序可以停止,不是逻辑问题,是互斥锁的问题。如果大佬知道如何解决,请告知。
版权声明:本文为qq_51408776原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。