以下是一个示例代码,用于避免重复预订/双重消费的问题:
from threading import Lock
class BookingSystem:
def __init__(self):
self.booked_slots = set()
self.lock = Lock()
def book_slot(self, slot_id):
with self.lock:
if slot_id in self.booked_slots:
print(f"Slot {slot_id} has already been booked.")
return False
self.booked_slots.add(slot_id)
print(f"Slot {slot_id} has been booked successfully.")
return True
def cancel_booking(self, slot_id):
with self.lock:
if slot_id not in self.booked_slots:
print(f"Slot {slot_id} has not been booked.")
return False
self.booked_slots.remove(slot_id)
print(f"Booking for slot {slot_id} has been cancelled.")
return True
booking_system = BookingSystem()
# 示例用法
booking_system.book_slot(1) # Slot 1 has been booked successfully.
booking_system.book_slot(2) # Slot 2 has been booked successfully.
booking_system.book_slot(1) # Slot 1 has already been booked.
booking_system.cancel_booking(2) # Booking for slot 2 has been cancelled.
booking_system.book_slot(2) # Slot 2 has been booked successfully.
在示例代码中,BookingSystem
类使用一个线程锁来确保并发访问时的数据一致性。book_slot
方法用于预订一个时间槽,首先检查该时间槽是否已被预订,如果已经预订则返回 False,否则将该时间槽加入已预订集合。cancel_booking
方法用于取消预订,首先检查该时间槽是否已被预订,如果未预订则返回 False,否则将该时间槽从已预订集合中移除。
请注意,示例代码中的锁是针对整个预订系统的,如果需要更细粒度的锁定,可以根据实际情况进行调整。此外,示例代码中的打印语句可以根据实际需求进行修改或替换为其他逻辑。