Python多任务编程——线程锁死锁

简介: 解决线程锁死锁

概念


死锁:某一线程的锁没有及时释放导致的程序无法继续运行下去。是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。



案例

importthreadingimporttime# 创建互斥锁lock=threading.Lock()
# 根据下标去取值, 保证同一时刻只能有一个线程去取值defget_value(index):
# 上锁lock.acquire()
print(threading.current_thread())
my_list= [3,6,8,1]
# 判断下标释放越界ifindex>=len(my_list):
print("下标越界:", index)
returnvalue=my_list[index]
print(value)
time.sleep(0.2)
# 释放锁lock.release()
if__name__=='__main__':
# 模拟大量线程去执行取值操作foriinrange(30):
sub_thread=threading.Thread(target=get_value, args=(i,))
sub_thread.start()

运行结果

z9gwlzd1ol.png

分析

 上面的程序中在get_value函数中,因为下标越界直接结束了这个函数,并没有执行下面的lock.release()命令,锁一直处于锁住的状态,其他线程无法执行,程序一直在等待运行中。



解决方法:

在合适的地方释放锁


importthreadingimporttime# 创建互斥锁lock=threading.Lock()
# 根据下标去取值, 保证同一时刻只能有一个线程去取值defget_value(index):
# 上锁lock.acquire()
print(threading.current_thread())
my_list= [3,6,8,1]
ifindex>=len(my_list):
print("下标越界:", index)
# 当下标越界需要释放锁,让后面的线程还可以取值lock.release()
returnvalue=my_list[index]
print(value)
time.sleep(0.2)
# 释放锁lock.release()
if__name__=='__main__':
# 模拟大量线程去执行取值操作foriinrange(30):
sub_thread=threading.Thread(target=get_value, args=(i,))
sub_thread.start()


目录
相关文章
|
12天前
|
安全 Java 调度
Java编程时多线程操作单核服务器可以不加锁吗?
Java编程时多线程操作单核服务器可以不加锁吗?
32 2
|
14天前
|
开发框架 并行计算 算法
揭秘Python并发神器:IO密集型与CPU密集型任务的异步革命,你竟还傻傻分不清?
揭秘Python并发神器:IO密集型与CPU密集型任务的异步革命,你竟还傻傻分不清?
30 4
|
2天前
|
运维 API 计算机视觉
深度解密协程锁、信号量以及线程锁的实现原理
深度解密协程锁、信号量以及线程锁的实现原理
8 1
|
3天前
|
开发框架 并行计算 .NET
脑洞大开!Python并发与异步编程的哲学思考:IO密集型与CPU密集型任务的智慧选择!
脑洞大开!Python并发与异步编程的哲学思考:IO密集型与CPU密集型任务的智慧选择!
9 1
|
15天前
|
开发框架 并行计算 .NET
燃烧吧,Python!异步编程如何点燃IO密集型任务,让CPU密集型任务也加速狂奔?
燃烧吧,Python!异步编程如何点燃IO密集型任务,让CPU密集型任务也加速狂奔?
15 2
|
21小时前
|
Java API
【多线程】乐观/悲观锁、重量级/轻量级锁、挂起等待/自旋锁、公平/非公锁、可重入/不可重入锁、读写锁
【多线程】乐观/悲观锁、重量级/轻量级锁、挂起等待/自旋锁、公平/非公锁、可重入/不可重入锁、读写锁
9 0
|
2天前
|
监控 并行计算 数据处理
构建高效Python应用:并发与异步编程的实战秘籍,IO与CPU密集型任务一网打尽!
在Python编程的征途中,面对日益增长的性能需求,如何构建高效的应用成为了每位开发者必须面对的课题。并发与异步编程作为提升程序性能的两大法宝,在处理IO密集型与CPU密集型任务时展现出了巨大的潜力。今天,我们将深入探讨这些技术的最佳实践,助你打造高效Python应用。
9 0
|
2天前
|
Java C语言 Python
解析Python中的全局解释器锁(GIL):影响、工作原理及解决方案
解析Python中的全局解释器锁(GIL):影响、工作原理及解决方案
6 0
|
15天前
|
存储 算法 Java
关于python3的一些理解(装饰器、垃圾回收、进程线程协程、全局解释器锁等)
该文章深入探讨了Python3中的多个重要概念,包括装饰器的工作原理、垃圾回收机制、进程与线程的区别及全局解释器锁(GIL)的影响等,并提供了详细的解释与示例代码。
16 0
|
1天前
|
存储 数据可视化 Python
Python编程中的数据可视化技术
在数据驱动的世界中,将复杂的数据集转换为易于理解的视觉表示形式至关重要。本文将深入探讨如何使用Python进行数据可视化,包括选择合适的库、处理数据和设计有效的图表。我们将一起学习如何让数据讲故事,并确保你的信息传达清晰且有影响力。