MST

星途 面试题库

面试题:Python多线程数据共享的复杂场景处理

假设你在开发一个多线程的金融交易系统,有多个线程同时对账户余额进行读写操作,可能会出现资源竞争问题。请设计一个基于Python多线程的数据共享策略,使用`threading.Condition`来确保资金的安全转移,并阐述你设计的思路。
28.0万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
import threading

class Account:
    def __init__(self, balance):
        self.balance = balance
        self.condition = threading.Condition()

    def transfer(self, amount, target_account):
        with self.condition:
            while self.balance < amount:
                self.condition.wait()
            self.balance -= amount
            target_account.deposit(amount)

    def deposit(self, amount):
        with self.condition:
            self.balance += amount
            self.condition.notify_all()

设计思路:

  1. 定义账户类 Account
    • 包含账户余额 balance 作为共享资源。
    • 创建 threading.Condition 对象 condition,用于线程间的协作和同步。
  2. transfer 方法
    • 使用 with self.condition 上下文管理器获取锁。
    • 检查当前账户余额是否足够,如果不足则调用 self.condition.wait() 使当前线程等待,释放锁并暂停执行,直到被其他线程唤醒。
    • 当余额足够时,扣除相应金额,并调用目标账户的 deposit 方法。
  3. deposit 方法
    • 使用 with self.condition 上下文管理器获取锁。
    • 增加账户余额,并调用 self.condition.notify_all() 唤醒所有等待在 condition 上的线程,通知它们账户余额已经改变,可能满足了等待条件。这样,通过 threading.Condition 实现了多线程环境下对账户余额操作的安全控制,避免了资源竞争问题,确保资金的安全转移。