往期文章:
线程安全概念介绍
线程安全指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。由于线程的执行随时会发生切换,就造成了不可预料的结果,出现线程不安全。
上图展示的是一个取钱的过程,每次取钱,先进行if判断,然后再减去金额。线程1执行到if判断完,就被切换到线程2了。 此时,线程2也进入到了if中又被切换到线程1,线程1继续执行下去,减去金额,取到了钱。切换到线程2,也减去金额,取到了钱,显然就有问题了。 银行亏了600块。
Lock用于解决线程安全问题
try-finally模式
import threading
lock = threading.Lock()
lock.acquire()
try:
#do something
finally:
lock.release()
with模式(更常用)
import threading
lock = threading.Lock()
whit lock:
#do something
线程锁使用实例
import threading
import time
from loguru import logger
lock = threading.Lock()
class Account:
def __init__(self,balance) -> None:
self.balance = balance
def draw(account:Account,amount):
with lock:
if account.balance >= amount:
time.sleep(1)
logger.info("{}取钱成功".format(threading.current_thread().name))
account.balance -= amount
logger.info("线程{},{}余额".format(threading.current_thread().name,account.balance))
else:
logger.error("{}取钱失败,余额不足!".format(threading.current_thread().name))
if __name__ == "__main__":
account = Account(1000)
task1 = threading.Thread(target=draw,args=(account,800),name="task1")
task2 = threading.Thread(target=draw,args=(account,800),name="taks2")
task1.start()
task2.start()
执行结果如下: