• python多线程 Lock使用


    多线程经常使用的银行储户同时取钱来作为实例

    不加锁的多线程

    import time
    import threading
    class Account():
    def __init__(self,account_no, balance):
    # 构造函数account_no账户名,blance账户余额
    self.account_no=account_no
    self.balance=balance

    #取钱函数
    def drop(account,draw_amount):
    if account.balance > draw_amount:
    print(threading.current_thread().name+'取款成功,取出:'+str(draw_amount))
    time.sleep(2)
    account.balance -= draw_amount
    print('账户余额为:'+str(account.balance))

    else:
    print(str(account.account_no)+'余额不足')

    a=Account('12345',1000)
    threading.Thread(name="甲",target=drop,args=(a,800)).start()
    threading.Thread(name="乙",target=drop,args=(a,800)).start()
    因为没有锁,用户的存款会多次成为负数
    加锁以后
    import threading, time


    # 导入线程模块 ,不加锁的话就会造成用户的存款变为负数~
    class Account():
    def __init__(self, accoun_no, balance):
    self.accoun_no = accoun_no # 模拟卡号
    self.balance = balance # 模拟存数数额
    self.lock = threading.RLock() # 加锁变量

    def get_Balance(self):
    return self.balance # 得到余额

    def draw(self, draw_amount): # 取钱方法 draw_amount 取钱的数量
    self.lock.acquire() # 上锁
    try: # 异常
    if draw_amount < self.balance:
    # threading.current_thread().name获取进程的名字
    print(threading.current_thread().name + '取钱成功,取出:' + str(draw_amount))
    time.sleep(1.5)
    self.balance -= draw_amount
    print('账户余额为:' + str(self.balance))
    else:
    print(threading.current_thread().name + '取钱失败,账户余额不足!')
    finally:
    self.lock.release() # 解锁


    def draw(account, draw_amount): # 定义一个取钱的函数 account储户的实例 draw取钱的金额
    account.draw(draw_amount) # 使用储户实例的draw方法


    if __name__ == '__main__':
    a1 = Account('123456', 1000) # 生成一个储户实例
    threading.Thread(name="甲", target=draw, args=(a1, 800)).start() # 用户甲使用储户a1账户取钱
    # name=给进程取的名称,ainThread为主线程
    threading.Thread(name='乙', target=draw, args=(a1, 800)).start() # 用户乙同时使用储户a1账户取钱
  • 相关阅读:
    Windows程序员的Linux快捷键
    Handeler的详细解释
    Asp.Net_Mvc_View
    使用脚本方式和使用控件方式来输出Html内容的区别
    当发布时报错: 找不到 obj\Debug\Package\PackageTmp\xxx.aspx 文件
    网路岗v1.2简单使用
    Html.Encode
    Android开发中的错误
    Asp.Net_Mvc_IgnoreRoute
    Linux目录结构
  • 原文地址:https://www.cnblogs.com/Centwei/p/15818205.html
Copyright © 2020-2023  润新知