Sobes.tech
Middle
42

Tarea de depuración: corregir la condición de carrera al retirar dinero (dos solicitudes paralelas pueden retirar más de lo que hay en la cuenta)

Empresas donde se preguntó
aic

Respuesta de la IA

sobes.tech AI

Race condition при списании денег возникает, когда два параллельных запроса одновременно проверяют баланс и списывают деньги, не видя изменений друг друга, что может привести к списанию суммы больше, чем есть на счёте.

Чтобы исправить это в Python, нужно обеспечить атомарность операции списания. Один из способов — использовать блокировку (lock), чтобы только один поток мог выполнять проверку и списание одновременно.

Пример с использованием threading.Lock:

import threading

class Account:
    def __init__(self, balance):
        self.balance = balance
        self.lock = threading.Lock()

    def withdraw(self, amount):
        with self.lock:  # блокируем доступ для других потоков
            if self.balance >= amount:
                self.balance -= amount
                return True
            else:
                return False

account = Account(100)

# Вызовы account.withdraw(amount) из разных потоков будут безопасны

Если используется база данных, лучше применить транзакции с блокировками или атомарные операции на уровне БД, чтобы избежать race condition.