多线程-银行账户管理

""" __author__ = 王梁旭"""
import time
from threading import Thread, Lock

"""
多线程模拟银行到账操作:一百个账户同时转账到账户(操作存在延迟)
(由于系统存在延迟,在系统睡眠时,其它线程会调用数据,使结果被未知次覆盖,
最后不能得到正确的数据)
(给数据加线程锁,保证一个数据一把锁,会使数据调用变得像排队一样,
一个数据调用结束后开锁后才能被下一个线程调用)
"""


class Account:
    """
    账户类
    """
    def __init__(self):
        self.balance = 0.0
        self.lock = Lock()

    def deposit(self, money):
        # 给线程加锁
        with self.lock:
            new_balance = self.balance + money
            time.sleep(0.001)  # 模拟延迟
            self.balance = new_balance
        # with 之后自动解锁

def main():
    """
    多线程创建一百个账户转账进入账户
    :return: 0
    """
    account = Account()
    threads = []
    for _ in range(100):
        # 起一个线程对象
        t = Thread(target=account.deposit, args=(1,))
        # 将线程对象存入列表
        threads.append(t)
        # 开启线程
        t.start()
    for t in threads:
        # 线程对象加 join() ,执行该对象完之后在执行后面的方法
        t.join()
    print(account.balance)


if __name__ == '__main__':
    main()

你可能感兴趣的:(多线程-银行账户管理)