- Lock
加入锁Lock之后,在lock.acquire()和lock.release()之间的代码是线程安全的
total=0
lock=Lock()
def add():
#1. dosomething1
#2. io操作
#3. dosomething3
global total
for i in range(1000000):
lock.acquire() #加锁
total +=1
lock.release() #释放
def desc():
global total
for i in range(1000000):
lock.acquire() #加锁
total -=1
lock.release() #释放
import threading
thread1=threading.Thread(target=add)
thread2=threading.Thread(target=desc)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print(total)
#结果:0
- 用锁会影响性能
- 锁会引起死锁
引起死锁的情况1
lock.acquire()
lock.acquire() #在lock未释放,又加锁,就引起了死锁
# do something
lock.release()
引起死锁的情况2
#使用伪代码说明
A需要变量a和b,B需要变量a和b
A首先对a加锁,B对b加锁,A需要b,但是已经被B加锁,那么A无法对b加锁,导致了死锁
A(a,b)
acquire(a)
acquire(b)
B(a, b)
acquire(b)
acquire(a)
2.RLock:在同一个线程里面,可以连续调用多次acquire,一定要注意acquire的次数要和release的次数相等
代码如上,只要把Lock改成RLock即可,这样可以解决Lock死锁情况1的问题
lock=Lock() ----> lock=RLock()