微慑信息网

python 线程安全测试threading.lock()

抄的视频代码做的测试,代码如下?

#coding:utf-8
import  threading
import time

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

def draw(account,amount):
    if account.balance >= amount:
        #time.sleep(0.1)
        account.balance-=amount
        #print '取钱成功,余额为:',account.balance
        print threading.currentThread().name,'取钱成功,余额为::',account.balance
    else:
        print threading.currentThread().name,'取钱失败------------,余额:',account.balance

def main():

    while True:
        account = Myaccount(1000)
        ta = threading.Thread(name="ta",target=draw,args=(account,800))
        tb = threading.Thread(name= "tb",target=draw, args=(account, 800))
        ta.start()
        tb.start()

        #ta.join()
        #tb.join()

if __name__ == '__main__':
    main()

按原理将,在没设置线程安全锁时,是可能线程相互串行了,导致用户存款扣除800后,会再扣除800,于是余额为-600

但是,进行了大量测试,发现压根无法出现-600的情况。。。

不过按照视频说的,在线程中使用了timel.sleep方法,将会导致线程串行,会导致出现-600的情况:

下面为使用线程锁的代码(使用了with lock):

#coding:utf-8
import  threading
import time

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

def draw(account,amount):
    with lock:
        if account.balance >= amount:
            time.sleep(0.1)
            account.balance-=amount
            print threading.currentThread().name,'取钱成功,余额为::',account.balance
        else:
            print threading.currentThread().name,'取钱失败------------,余额:',account.balance

def main():

    while True:
        account = Myaccount(1000)
        ta = threading.Thread(name="ta",target=draw,args=(account,800))
        tb = threading.Thread(name= "tb",target=draw, args=(account, 800))
        ta.start()
        tb.start()

        #ta.join()
        #tb.join()

if __name__ == '__main__':
    main()

 

赞(0) 打赏
转载请附本站链接,未经允许不得转载,,谢谢:微慑信息网-VulSee.com » python 线程安全测试threading.lock()

评论 抢沙发

微慑信息网 专注工匠精神

微慑信息网-VulSee.com-关注前沿安全态势,聚合网络安全漏洞信息,分享安全文档案例

访问我们联系我们

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册