python 死锁 死锁的示例 with

线程锁的使用 (with语句加普通锁写法) with语句 Python Threading中的Lock模块有acquire()和release()两种方法,这两种方法与with语句的搭配相当于,进入with语句块时候会先执行acquire()方法,语句块结束后会执行release方法。 import threading import time lock = threading.Lock() class Singleton(): def __init__(self): time.sleep(1) @clas 阅读详情

死锁

  1. 死锁: 死锁就是一直等待对方释放锁的情景
  2. 死锁的结果会造成程序的停止响应, 不能再处理其他的任务了

死锁的示例

需求: 根据下标在列表中取值, 保证同一时刻只能有一个线程去取值

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 = my_list[index]
	print("value", 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()

# 控制台输出
<Thread(Thread-1, started 10400)>
value 3
<Thread(Thread-2, started 568)>
value 6
<Thread(Thread-3, started 6360)>
value 8
<Thread(Thread-4, started 13328)>
value 1
<Thread(Thread-5, started 3012)>
下标越界 4


# 此刻程序还未结束

避免死锁

避免死锁就要在合适的地方释放锁

import threading
import time

# 创建互斥锁
lock = threading.Lock()

# 根据下标去取值, 保证在同一时刻只能有一个线程取值
def get_value(index):
	
	lock.acquire()
	print(threading.surrrent_thred())
	my_list = [3, 6, 8, 1]
	if index >= len(my_list):
		print("下标越界", index)
		# 当下标越界需要释放释放锁, 让后边的线程还可以取值
		lock.release()
		return
	value = 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()

		
#  控制台输出 <没有产生死锁>
<Thread(Thread-1, started 14704)>
3
<Thread(Thread-2, started 11788)>
6
<Thread(Thread-3, started 1220)>
8
<Thread(Thread-4, started 15180)>
1
<Thread(Thread-5, started 11204)>
下标越界 4
<Thread(Thread-6, started 12608)>
...
<Thread(Thread-29, started 9496)>
下标越界 28
<Thread(Thread-30, started 12456)>
下标越界 29

个人见解,仅供参考
刚才在写避免死锁的程序时, 突然奇想想用 with 试试, 试完之后发现 with 能巧妙地避开这个死锁的问题.然后大胆想象了一下, with 是不是能避免死锁, 就百度找了下文章. 发现 python中确实可以用 with 避免死锁

import threading
import time

# 创建互斥锁
lock = threading.Lock()

# 根据下标去取值, 保证同一时刻只能有一个线程去取值


def get_value(index):
	# with 自己上锁, 并自己释放锁
	with lock:
		print(threading.current_thread())
		my_list = [3, 6, 8, 1]
		if index >= len(my_list):
			print("下标越界", index)
			return
		value = my_list[index]
		print(value)
		time.sleep(0.2)


if __name__ == "__main__":
	# 模拟大量线程去执行取值操作
	for i in range(30):
		sub_thread = threading.Thread(target=get_value, args=(i,))
		sub_thread.start()

小结

  1. 使用互斥锁的时候需要注意死锁的问题, 要在合适的地方注意释放锁
  2. 死锁一旦产生就会造成应用程序的停止响应, 应用程序无法再继续往下执行了
  3. with 可以避免上边的问题, 个人见解
Python下多线程数据脏读的解决---加锁和解锁 不加锁 import threading num = 0 def test(): global num for i in range(10000000): num -= 100 num += 100 if __name__ == '__main__': thread1 = threading.Thread(target=test) ... 阅读详情

相关推荐

8、Python并发编程:死锁处理与并发Web请求

本文深入探讨了Python并发编程中的关键问题,包括死锁的产生与解决方案,通过`with`语句优化资源管理;介绍了Web请求的基础知识,如HTTP方法与状态码;并通过`requests`模块展示了如何实现高效的并发Web请求。内容还涵盖了超时处理、最佳实践以及使用线程提升数据收集效率的实战示例。无论你是初学者还是进阶开发者,都能从中获得提升程序稳定性与性能的实用技巧。

white的博客 68

Python 线程,with的作用(自动获取和释放锁Lock)

python中with的作用其实就是省去了开启关闭的功能,比如使用python打开.txt文件,需要先open,最后读写完了,需要close。 在线程中也是这样的,我们给资源加上锁Lock,使用前需要 1. 定义锁:lock = threading.Lock() 2. 启动lock.acquire() 3. 用完之后的释放lock.release() 而是用with lock则省去了上...

qq_18668137的博客 3930

11、 使用线程中的 `with` 语句

本文深入探讨了Python中`with`语句的作用及其在并发和并行编程中的应用,包括上下文管理的概念、语法以及常见用法。通过具体示例展示了如何使用`with`语句管理文件、数据库连接、网络连接和临时文件等资源,并介绍了锁的高级用法如重入锁、条件变量和信号量。同时,还提供了上下文管理器的优化技巧和实际应用场景,帮助读者编写高效可靠的Python代码。

weixin_31591833的博客 103

Python线程锁 threading.Lock()介绍

在 Python 中,线程锁(Thread Lock)是一种同步原语,用于在多线程环境中协调线程之间的访问,避免多个线程同时访问共享资源时出现竞态条件(Race Condition)。线程锁确保在任何时刻只有一个线程可以访问特定的资源。为了实现线程锁,Python的threading模块提供了Lock类,下面将先简单介绍下Lock类的一些基础概念和用法。

qq_42310545的博客 2905

玩转ubuntu18 --机器视觉方面(yolo算法识别及摄像头和cmake问题解决)

玩转ubuntu18 --机器视觉方面(yolo v3算法识别) 1.YOLO的简介 工作原理 先前的检测系统重新调整分类器或本地化器以执行检测。他们将模型应用于多个位置和比例尺的图像。图像的高分区域被视为检测。 我们使用完全不同的方法。我们将单个神经网络应用于整个图像。该网络将图像划分为区域,并预测每个区域的边界框和概率。这些边界框按预测概率加权。 我们的模型比基于分类器的系统具有几个优势。它在测试时间查看整个图像,因此其预测由图像中的全球上下文提供信息。它还通过单一网络评估进行预测,这与R-CNN等系统

qq_53951823的博客 1556

PTrade数据交互全流程详解:从本地文件上传到定时导出交易数据

本文详细解析了PTrade量化交易平台的数据交互全流程,涵盖从本地文件自动上传交易指令到定时导出成交数据的完整链路。通过文件媒介实现本地策略与云端实盘的安全、稳定对接,并提供了构建自动化、稳健数据流水线的实战配置方案与代码示例,助力量化工作流平滑过渡至实盘。

gg901的博客 882

容易犯且复杂的Python错误

使用math模块中的isclose函数进行浮点数比较,或者比较它们的差值是否在可接受的范围内。增加递归深度限制(不建议,因为可能会导致栈溢出),或者使用迭代替代递归来计算阶乘。:由于浮点数精度问题,两个看似相等的浮点数无法正确比较。程序可能无法释放文件资源,导致其他操作无法访问该文件。:多个线程同时访问和修改共享数据,导致不可预测的结果。:打开文件但未在使用完毕后关闭它,导致资源泄漏。:两个线程相互等待对方释放锁,导致程序停滞。两个线程都无法继续执行,程序永远无法完成。:递归调用的深度过大,导致递归错误。

m0_62110645的博客 344

特征模理论指导滤波天线设计的优势和方法

本文探讨了特征模理论在滤波天线设计中的应用优势和方法。特征模理论通过分析天线结构的本征模特性,突破了传统经验设计的局限,实现了辐射与滤波功能的一体化设计。文章重点阐述了如何利用模式显著性(MS)和模式加权系数(MWC)来指导辐射零点的产生,揭示了辐射零点形成的物理机制。通过特征模分析,设计师可以明确调控天线结构和馈电系统,优化滤波性能。这种方法为现代多频/宽带滤波天线设计提供了理论依据和实用工具,显著提升了设计效率和性能指标。

qq_64207806的博客 957

python怎么加锁_Python开发【笔记】:加锁的最佳方案

避开死锁代码程序中,尽量要避免死锁的产生,下面分析常见的线程锁使用方式 ;注:只有同一把锁才会产生互斥1、常见的死锁方式(加锁时程序报错,锁未释放):import timeimport threadingclass Lock():def __init__(self):self.mutex = threading.Lock()def error(self):try:self.mutex.acquir...

weixin_39731586的博客 1048

国内主流AI编程工具使用实例及总结

AI编程辅助工具是利用人工智能技术来帮助程序员进行软件开发的工具。它们可以在代码编写、代码审查、错误检测、代码优化等多个编程环节发挥作用,提高编程效率和代码质量。通义灵码,基于通义大模型的AI研发辅助工具,提供代码智能生成、研发智能问答、任务自主执行等能力,为开发者带来智能化研发体验,引领AI原生研发新范式。包含智能编码助手和AI程序员。

技术博客 1万+

YOLOv8极速瘦身实战:LAMP剪枝让模型又快又准

一个庞大的模型虽然强大,但在实际部署,尤其是资源受限的边缘设备(如无人机、移动电话、嵌入式系统)上,却面临着严峻的挑战:高昂的内存占用、巨大的计算量以及随之而来的高延迟和高能耗。本教程从LAMP剪枝的深刻理论出发,详细解释了它如何通过最小化最坏情况下的L2失真,并借助巧妙的数学简化,最终推导出一种高效、无超参数、层自适应的剪枝策略。它如同为臃肿的模型进行一次精准的“瘦身手术”,通过移除网络中冗余或不重要的权重、神经元甚至整个结构,来显著降低模型的参数量和计算量(FLOPs),从而实现推理加速和资源节约。

FJN110的博客 258

python为什么安全_资源-从Python的“ with”块中产生安全吗?(为什么)?

协程与资源获取的结合似乎会带来一些意想不到的(或不直观的)后果。基本的问题是这样的事情是否有效:def coroutine():with open(path, 'r') as fh:for line in fh:yield line是的。 (您可以测试!)更深层次的担忧是,应该将with替换为finally的一种替代方法,在该方法中,您要确保在块末释放资源。 协程可以从with块中暂停并恢复执行,...

weixin_39662594的博客 186

【微信小程序-uniapp】CustomPicker 自定义单项选择器组件

自定义底部弹出框单项选择器组件,适用于uniapp小程序

Komorebi_00的博客 1532

Python开发【笔记】:加锁的最佳方案

避开死锁 代码程序中,尽量要避免死锁的产生,下面分析常见的线程锁使用方式 ;注:只有同一把锁才会产生互斥 1、常见的死锁方式(加锁时程序报错,锁未释放): import time import threading class Lock(): def __init__(self): self.mutex = threading.Lock(...

abchhcba2014的博客 257

【vsomeip3 教程】SOME/IP中间件去抖策略全解析

本文探讨了在SOME/IP中间件中实现Debounce(去抖动)机制的必要性和实现原理。文章首先分析了中间件层进行Debounce的四大动机:多订阅者共享收益、语义显式化、协议噪声屏蔽和入口处背压控制。接着详细阐述了Debounce的底层原理,包括变化检测机制(ignore和mask的应用)、时间门控策略(interval的两种时间基准)以及超时补发机制,并通过表格清晰展示了不同参数组合的效果和适用场景。最后,文章提出了工程落地的具体方法,包括策略选型、ignore/mask的设计方法论以及分层验证调试的实

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 232

4、硬件工程师笔试面试知识器件篇——电阻(2025版本)

本文系统介绍了电阻的基础知识与应用。首先阐述了电阻的定义、工作原理及类型(固定/可变电阻),详细说明了常见电阻材料(碳膜、金属膜、线绕等)的特性与标记方法。重点分析了电阻在电路设计中的关键参数:功率计算需考虑1.5-2倍安全裕度,温度系数影响电路稳定性。文章还对比了不同封装形式(轴向/贴片/功率封装等)的适用场景,特别强调高功率电路需选择专用封装并做好散热设计。最后指出电路仿真可优化电阻选择,并列举了相关电子元件在设计中同样需要仿真验证。全文为硬件工程师提供了电阻选型的实用指导。

XU157303764的博客 5210

随笔录--Python锁

Python里面的锁一些常见用法

Bigbin666的博客 489

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

谈谈Python线程中的“锁机制”

何为Lock( 锁 )?如何使用Lock( 锁 )?为何要使用锁?可重入锁(RLock)防止死锁的加锁机制饱受争议的GIL(全局锁) 何为Lock( 锁 )? 何为Lock( 锁 ),在网上找了很久,也没有找到合适的定义。可能锁这个词已经足够直白了,不需要再解释了。 但是,对于新手来说,我还是要说下我的理解。 我自己想了个生活中例子来看下。 有一个奇葩的房东,他家里有两个房间想要出...

python学习者的博客 1352

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

python lock_python使用lock | 学步园

Python定时器是计算机常用的计算机语言,在其广泛的实际应用操作中会涉及到Lock的实际应用,如果你对Python定时器中Lock的实际应用感兴趣的话,你可以通过我们的文章对其有更深的了解。在Python定时器中Lock的实际应用Lock/RLock 和 C# lock 关键字差不多意思。不同的是,Lock/RLock 只需 "锁定" 自己,而 C# lock 还得另外找个引用类型对象。Lock...

weixin_39632728的博客 465

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Python | 多线程死锁问题的巧妙解决方法

死锁 死锁的原理非常简单,用一句话就可以描述完。就是当多线程访问多个锁的时候,不同的锁被不同的线程持有,它们都在等待其他线程释放出锁来,于是便陷入了永久等待。比如A线程持有1号锁,等待2号锁,B线程持有2号锁等待1号锁,那么它们永远也等不到执行的那天,这种情况就叫做死锁。 关于死锁有一个著名的问题叫做哲学家就餐问题,有5个哲学家围坐在一起,他们每个人需要拿到两个叉子才可以吃饭。如果他们同时拿起自己左手边的叉子,那么就会永远等待右手边的叉子释放出来。这样就陷入了永久等待,于是这些哲学家都会饿死..

weixin_39363245的博客 224

python并行线程倒计时_[python 并行2]线程

线程篇基本使用python线程使用的两个模块为: _thread (不推荐再使用)、 threading(查看threading的源码可以发现,threading实际是对_thread进一步的封装,官方将其称为 Low-level threading API,下面简单尝试使用_thread)调用start_new_thread()函数生成新线程函数声明:_thread.start_new_thr...

weixin_39861955的博客 304

python死锁案例_Python中死锁的形成示例及死锁情况的防止

死锁示例搞多线程的经常会遇到死锁的问题,学习操作系统的时候会讲到死锁相关的东西,我们用Python直观的演示一下。死锁的一个原因是互斥锁。假设银行系统中,用户a试图转账100块给用户b,与此同时用户b试图转账200块给用户a,则可能产生死锁。2个线程互相等待对方的锁,互相占用着资源不释放。#coding=utf-8import timeimport threadingclass Account:d...

weixin_39940901的博客 188

Python 多线程死锁的示例

在 Python 中多线程中为了防止资源竞争而出现问题,提供了锁的机制,当一个线程操作资源时进行加锁,操作完毕后释放锁,这样其他线程就不会同时操作资源导出出现异常。 在 Python 多线程中注意是两种锁:互斥锁和递归锁 那么它们有什么区别呢? 互斥锁: 一旦一个线程获得一个互斥锁,会阻塞随后尝试获得锁的线程,直到它被释放;任何线程都可以释放它。 递归锁: 递归锁必须由获取它的线程释放。一旦线程获得了递归锁,同一个线程再次获取它将不阻塞;线程必须在每次获取它时释放一次。 虽然锁可以防止程序出问题,但是使用锁

haeasringnar的博客 618
上一篇: python 中互斥锁 死锁
下一篇: python中 GIL的有关问题,以及面试中可能会被问到的问题
LanLanDeMing
博客等级 码龄7年 60粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值