4. 线程锁
在程序中如果想要自己手动加锁,一般有两种:Lock 和 RLock。 Lock 不可以嵌套加锁,RLock 可以嵌套加锁。
Lock(互斥锁)
Lock 开销小,速度快。
python
import threading
number = 0
lock_object = threading.Lock()
def task():
print("线程开始")
lock_object.acquire() # 申请锁
global number
for _ in range(1000000):
number += 1
lock_object.release() # 释放锁
print(number)
for i in range(2):
t = threading.Thread(target=task)
t.start()RLock(递归锁)
RLock 支持多次申请锁和多次释放锁。比较推荐使用这种方式。
python
import threading
import time
lock_object = threading.RLock()
def task():
print("线程开始")
lock_object.acquire() # 申请锁
print("第一次申请锁成功")
lock_object.acquire() # 再次申请锁
print("第二次申请锁成功")
time.sleep(2)
lock_object.release() # 释放锁
print("第一次释放锁成功")
lock_object.release() # 再次释放锁
print("第二次释放锁成功")
for i in range(2):
t = threading.Thread(target=task)
t.start()