Python开发【笔记】:加锁的最佳方案
避开死锁
代码程序中,尽量要避免死锁的产生,下面分析常见的线程锁使用方式 ;注:只有同一把锁才会产生互斥
1、常见的死锁方式(加锁时程序报错,锁未释放):
import time import threading class Lock(): def __init__(self): self.mutex = threading.Lock() def error(self): try: self.mutex.acquire() a = '1' b = 2 print(a+b) self.mutex.release() except Exception as e: print(e) def safe(self): try: self.mutex.acquire() a = 1 b = 2 print(a + b) self.mutex.release() except Exception as e: print(e) def func1(cls): while True: cls.safe() time.sleep(0.1) def func2(cls): while True: cls.error() time.sleep(0.1) if __name__ == '__main__': lock = Lock() t1 = threading.Thread(target=func1,args=(lock,)) t1.start() t2 = threading.Thread(target=func2,args=(lock,)) t2.start() # 3 # must be str, not int
执行上面代码,异常抛出时,锁未释放,程序卡死
2、修补代码死锁情况(抛异常处添加锁释放):
import time import threading class Lock(): def __init__(self): self.mutex = threading.Lock() def error(self): try: self.mutex.acquire() a = '1' b = 2 print(a+b) self.mutex.release() except Exception as e: print(e) self.mutex.release() def safe(self): try: self.mutex.acquire() a = 1 b = 2 print(a + b) self.mutex.release() except Exception as e: print(e) def func1(cls): while True: cls.safe() time.sleep(0.1) def func2(cls): while True: cls.error() time.sleep(0.1) if __name__ == '__main__': lock = Lock() t1 = threading.Thread(target=func1,args=(lock,)) t1.start() t2 = threading.Thread(target=func2,args=(lock,)) t2.start() # 3 # must be str, not int # must be str, not int # 3 # 3
3、最佳方案(不用手动释放,即使异常也会自动释放):
import time import threading class Lock(): def __init__(self): self.mutex = threading.Lock() def error(self): try: with self.mutex: a = '1' b = 2 print(a+b) except Exception as e: print(e) def safe(self): try: with self.mutex: a = 1 b = 2 print(a + b) except Exception as e: print(e) def func1(cls): while True: cls.safe() time.sleep(0.1) def func2(cls): while True: cls.error() time.sleep(0.1) if __name__ == '__main__': lock = Lock() t1 = threading.Thread(target=func1,args=(lock,)) t1.start() t2 = threading.Thread(target=func2,args=(lock,)) t2.start() # 3 # must be str, not int # 3 # must be str, not int # 3 # must be str, not int
相关推荐
YENCSDN 2020-11-17
lsjweiyi 2020-11-17
houmenghu 2020-11-17
Erick 2020-11-17
HeyShHeyou 2020-11-17
以梦为马不负韶华 2020-10-20
lhtzbj 2020-11-17
夜斗不是神 2020-11-17
pythonjw 2020-11-17
dingwun 2020-11-16
lhxxhl 2020-11-16
坚持是一种品质 2020-11-16
染血白衣 2020-11-16
huavhuahua 2020-11-20
meylovezn 2020-11-20
逍遥友 2020-11-20
weiiron 2020-11-16