1.请编写一个程序模拟多个售票窗口售卖一列火车票的过程。具体的,共有10个售票窗口,每个售票窗口随机休眠一段时间后售出随机数量的车票(1~10张);每张车票有唯一的编号(例如:1~1000号);请使用同步机制确保同一编号的一张票只能被售卖一次;该列车票售卖完毕,程序运行结束。 提示:可设定程序中按顺序售卖车票;请使用同步机制确保程序运行正确。
时间: 2023-06-16 22:06:01 浏览: 90
```python
import threading
import time
import random
# 定义车票类
class Ticket:
def __init__(self, ticket_id):
self.ticket_id = ticket_id
# 定义售票窗口类
class TicketWindow:
def __init__(self, window_id, ticket_list):
self.window_id = window_id
self.ticket_list = ticket_list
def sell_ticket(self):
# 随机休眠一段时间
time.sleep(random.randint(1, 3))
# 随机售出一定数量的车票
ticket_num = random.randint(1, 10)
for i in range(ticket_num):
# 获取一张未出售的车票
ticket = self.get_ticket()
if ticket is not None:
# 模拟售票过程
print("窗口{}售出了第{}张车票".format(self.window_id, ticket.ticket_id))
# 售出车票后,随机休眠一段时间
time.sleep(random.randint(1, 3))
print("窗口{}结束售票".format(self.window_id))
def get_ticket(self):
# 加锁
lock.acquire()
try:
# 获取未出售的车票
for ticket in self.ticket_list:
if not ticket:
continue
# 标记车票已出售
ticket = None
return Ticket(self.ticket_list.index(ticket) + 1)
else:
return None
finally:
# 释放锁
lock.release()
# 定义车票列表
ticket_list = [Ticket(i) for i in range(1, 1001)]
# 定义售票窗口列表
window_list = [TicketWindow(i, ticket_list) for i in range(1, 11)]
# 定义锁
lock = threading.Lock()
# 启动售票窗口线程
for window in window_list:
t = threading.Thread(target=window.sell_ticket)
t.start()
# 等待所有售票窗口线程结束
for window in window_list:
t.join()
print("所有车票已售完")
```
阅读全文