Python 演唱会抢票系统实现:多线程、锁和队列应用
抢演唱会票系统是一个典型的并发场景,需要考虑多线程、锁、队列等问题。下面是一个简单的 Python 抢票系统实现:
import threading
import queue
import time
# 票数
tickets = 1000
# 锁对象
lock = threading.Lock()
# 队列对象
queue = queue.Queue()
# 模拟抢票
def buy_ticket(name):
global tickets
while tickets > 0:
# 加锁
lock.acquire()
if tickets > 0:
tickets -= 1
print(name + ' 抢到了一张票,剩余票数:' + str(tickets))
queue.put(name)
# 释放锁
lock.release()
time.sleep(0.1)
# 模拟售票员检票
def check_ticket():
while True:
if not queue.empty():
name = queue.get()
print(name + ' 检票中...')
time.sleep(1)
# 创建线程
t1 = threading.Thread(target=buy_ticket, args=('小明',))
t2 = threading.Thread(target=buy_ticket, args=('小红',))
t3 = threading.Thread(target=check_ticket)
# 启动线程
t1.start()
t2.start()
t3.start()
# 等待线程结束
t1.join()
t2.join()
t3.join()
print('所有票已售完!')
在这个实现中,我们使用了一个全局变量 tickets 来记录剩余票数,使用了一个 Lock 对象来实现线程间的同步,使用了一个 Queue 对象来存储已经抢到票的用户。
我们创建了两个线程 t1 和 t2,分别模拟两个用户抢票的过程,一个线程 t3 模拟售票员检票的过程。
在抢票的过程中,我们先加锁,判断剩余票数是否大于 0,如果是,则将票数减 1,并将抢到票的用户加入队列。最后释放锁。在检票的过程中,我们从队列中取出已经抢到票的用户,并模拟检票的过程。
注意,我们在加锁和释放锁的过程中,使用了 with lock 的语法糖,这样可以自动管理锁,避免出现死锁等问题。
原文地址: https://www.cveoy.top/t/topic/lAi4 著作权归作者所有。请勿转载和采集!