现在有一个取钱函数 draw(account,money) 一个账户类 Account,有 一个实例属性余额 假设同一个账户可以在不同的终端同时取钱。所以需要实现一个多线程的取钱 功能,并保证线程安全。请写出代码。
时间: 2024-09-28 18:14:32 浏览: 27
为了实现一个多线程、线程安全的取钱功能,你可以使用Python的`threading`模块以及内置的`Lock`来同步对账户余额的修改。这里是一个简单的示例:
```python
import threading
class Account:
def __init__(self, balance):
self.balance = balance
self.lock = threading.Lock() # 创建一个锁对象
def draw(self, amount):
with self.lock: # 使用with语句自动释放锁
if amount <= self.balance: # 检查余额是否足够
self.balance -= amount
print(f"从账户中取出 {amount} 元,当前余额:{self.balance}")
else:
print("余额不足,无法取款.")
# 创建一个Account实例并设置初始余额
account = Account(1000)
# 定义取钱任务
def withdraw_task(account, money):
account.draw(money)
# 创建并启动两个并发取钱任务
threads = []
for _ in range(2): # 可以根据实际情况调整并发线程数
thread = threading.Thread(target=withdraw_task, args=(account, 500))
threads.append(thread)
thread.start()
# 等待所有线程完成
for thread in threads:
thread.join()
```
在这个例子中,`lock`对象确保了在任何时候只有一个线程可以访问`balance`属性进行取款操作,从而避免了竞态条件。如果需要更多的线程安全保护,还可以考虑使用`threading.Condition`或者数据库事务。
阅读全文