用python编写程序:3个窗口售票名字分别是window1、window2、window3,窗口之间共享一个票池,每个窗口都可以卖票直到票池里面没有票可以卖,初始票数是50张
时间: 2024-02-19 17:57:30 浏览: 16
好的,以下是用 Python 编写的程序实现您的要求:
```python
import threading
class TicketPool:
def __init__(self, total):
self.total = total
self.sold = 0
self.lock = threading.Lock()
def sell(self):
self.lock.acquire()
if self.sold < self.total:
self.sold += 1
print(f'{threading.current_thread().name} sold ticket {self.sold}')
self.lock.release()
return True
else:
self.lock.release()
return False
def sell_tickets(window, pool):
while pool.sell():
pass
print(f'{window} is sold out')
if __name__ == '__main__':
pool = TicketPool(50)
t1 = threading.Thread(target=sell_tickets, args=('Window1', pool))
t2 = threading.Thread(target=sell_tickets, args=('Window2', pool))
t3 = threading.Thread(target=sell_tickets, args=('Window3', pool))
t1.start()
t2.start()
t3.start()
t1.join()
t2.join()
t3.join()
print('All windows are closed')
```
说明:
1. 定义了 `TicketPool` 类来管理票池,包括总票数、已售票数和线程锁。
2. `sell` 方法用于售票,先获取锁,判断是否还有票可以售卖,如果有则售出一张,释放锁,返回 True;如果没有则释放锁,返回 False。
3. `sell_tickets` 方法是每个窗口的售票函数,循环调用 `pool.sell` 方法,直到票池中没有票可以售卖为止。
4. 在主程序中创建 3 个线程分别对应 3 个窗口,启动线程,等待线程结束,最后输出提示信息。
希望这个程序能够满足您的需求,如有疑问请随时提出。