概念
死锁:某一线程的锁没有及时释放导致的程序无法继续运行下去。是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
案例
import threading
import time# 创建互斥锁
lock = threading.Lock()# 根据下标去取值, 保证同一时刻只能有一个线程去取值
def get_value(index):# 上锁
lock.acquire()
print(threading.current_thread())
my_list = [3,6,8,1]
# 判断下标释放越界
if index >= len(my_list):
print("下标越界:", index)
return
value = https://www.it610.com/article/my_list[index]
print(value)
time.sleep(0.2)
# 释放锁
lock.release()if __name__ =='__main__':
# 模拟大量线程去执行取值操作
for i in range(30):
sub_thread = threading.Thread(target=get_value, args=(i,))
sub_thread.start()
运行结果
文章图片
分析 上面的程序中在get_value函数中,因为下标越界直接结束了这个函数,并没有执行下面的lock.release()命令,锁一直处于锁住的状态,其他线程无法执行,程序一直在等待运行中。
解决方法: 【Python多任务编程——线程锁死锁】在合适的地方释放锁
import threading
import time# 创建互斥锁
lock = threading.Lock()# 根据下标去取值, 保证同一时刻只能有一个线程去取值
def get_value(index):# 上锁
lock.acquire()
print(threading.current_thread())
my_list = [3,6,8,1]
if index >= len(my_list):
print("下标越界:", index)
# 当下标越界需要释放锁,让后面的线程还可以取值
lock.release()
return
value = https://www.it610.com/article/my_list[index]
print(value)
time.sleep(0.2)
# 释放锁
lock.release()if __name__ =='__main__':
# 模拟大量线程去执行取值操作
for i in range(30):
sub_thread = threading.Thread(target=get_value, args=(i,))
sub_thread.start()
推荐阅读
- Python网络编程——TCP服务端程序开发
- Python多任务编程——多线程的使用
- Python多任务编程——进程等待
- Python多任务编程——线程之间共享变量
- Python多任务编程——获取进程编号
- Python多任务编程——多进程的使用
- Python多任务编程介绍
- python|我,28岁,汽修转行自学Python,月薪15K,是我这辈子做的最正确的选择
- 深度学习|一文理解深度学习框架中的InstanceNorm