线程锁
- 前面在创建多线程的时候发现,线程的执行顺序有时会变乱,或者2个打印语句会打印在同一行,要想多线程不乱,可以使用线程锁
- 加上线程锁后,同一时间只会执行一个线程,也就是线程独占资源
- 要注意,锁不能滥用,若是因为某些原因没有解锁,就会造成死锁的现象,这样后面的线程也就无法执行。
模块threading中的Lock
用法:
import threading
lock = threading.Lock()
线程锁的加锁和解锁
例1:不加锁
import threading
import time
from concurrent.futures import ThreadPoolExecutor
from concurrent.futures import wait
def test(count):
print(f'count={count},线程名称是:{threading.current_thread().name}')
time.sleep(1)
return count
if __name__ == '__main__':
# 主线程开始时间
start_time = time.time()
# 创建线程池,里面有2个线程
t = ThreadPoolExecutor(2)
# 往线程池中添加任务
task = [t.submit(test, i) for i in range(4)]
# 等待线程池中任务执行完后再执行主线程
wait(task)
print(f'时间间隔是:{time.time()-start_time},当前线程名称是:{threading.current_thread().name}')
结果:
例2:加锁
import threading
import time
from concurrent.futures import ThreadPoolExecutor
from concurrent.futures import wait
def test(count, lock):
# 加锁
lock.acquire()
print(f'count={count},线程名称是:{threading.current_thread().name}')
time.sleep(1)
# 解锁
lock.release()
return count
if __name__ == '__main__':
# 创建线程锁
lock = threading.Lock()
# 主线程开始时间
start_time = time.time()
# 创建线程池,里面有2个线程
t = ThreadPoolExecutor(2)
# 往线程池中添加任务
task = [t.submit(test, i, lock) for i in range(4)]
# 等待线程池中任务执行完后再执行主线程
wait(task)
print(f'时间间隔是:{time.time()-start_time},当前线程名称是:{threading.current_thread().name}')
结果:
- 未加锁时主线程执行时间是4s,线程池中的线程同一时间执行2个线程
- 加锁后主线程执行时间是2s,线程池中的线程同一时间执行一个子线程
- 加锁后避免了线程间的资源抢占