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()
我们分析以下他的代码都是一个线程在卖票,极其不符合要求。 我上我写的源代码
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
def Sell(name):
global N
while True:
if N > 0:
sleep(0.1)
print("{}卖出第{}张票!\n".format(name, N))
N = N - 1
def main():
threads = {}
for i in ("A", "B"):
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()
运行结果如下: 程序还是不会停止,就是互斥锁的问题,当我们把互斥锁注释掉之后,程序可以停止,不是逻辑问题,是互斥锁的问题。如果大佬知道如何解决,请告知。
|