抢演唱会票系统是一个典型的并发场景,需要考虑多线程、锁、队列等问题。下面是一个简单的 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 对象来存储已经抢到票的用户。

我们创建了两个线程 t1t2,分别模拟两个用户抢票的过程,一个线程 t3 模拟售票员检票的过程。

在抢票的过程中,我们先加锁,判断剩余票数是否大于 0,如果是,则将票数减 1,并将抢到票的用户加入队列。最后释放锁。在检票的过程中,我们从队列中取出已经抢到票的用户,并模拟检票的过程。

注意,我们在加锁和释放锁的过程中,使用了 with lock 的语法糖,这样可以自动管理锁,避免出现死锁等问题。

Python 演唱会抢票系统实现:多线程、锁和队列应用

原文地址: https://www.cveoy.top/t/topic/lAi4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录