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) 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多任务编程——线程锁死锁
文章图片

分析 上面的程序中在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()

    推荐阅读