Python知识点19---锁

server/2024/12/22 21:28:07/

提前说一点:如果你是专注于Python开发,那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了,而如果你和作者一样只是操作其他技术的Python API那就足够了。

本篇主要目的,为大家说一下,在python的多线程开发中如何保证数据的正确性,首先明确一点,为什么在多线程的时候会发生数据问题?

其实在多个线程同时工作的时候,如果没有一定的措施,会导致争抢资源,而结果显而易见的,就是资源的缺失,就是说,一个线程从上一个线程哪里拿到的资源是不完整的

因此针对这一现象,Python有了第一种解决方法:互斥锁,就是多个线程去拿资源,谁拿到我们控制不了,但是我们可以控制当一个线程拿到资源之后,对这个资源上锁,不让其他线程使用了,让它们等该线程使用完,再开始争抢,这里注意,抢到资源的标识就是谁先拿到了互斥锁,并且上了锁

python">import threading
import timeaa = 0#全局变量创建互斥锁,本质上是threading模块的一个函数
lock = threading.Lock()def p():lock.acquire()	#上锁for i in range(1000000000) :global aaaa += 1print(aa)lock.release()	#解锁def q():lock.acquire()	#上锁for i in range(1000000000) :global aaaa += 1print(aa)lock.release()	#解锁if __name__ == '__main__' :a = threading.Thread(target=p)a.start()b = threading.Thread(target=q)b.start()结果:
1000000000
2000000000

使用互斥锁的时候,一定要明白,让程序正常运行的是锁,而不是被锁的数据


除了上面这种方式,Python还有另外一种方式就是join等待

python">import threading
import timeaa = 0def p():for i in range(100000) :global aaaa += 1print('a线程',aa)def q():for i in range(100000) :global aaaa += 1print('b线程',aa)if __name__ == '__main__' :a = threading.Thread(target=p)b = threading.Thread(target=q)a.start()a.join()b.start()

这种方式也可以,但是不完美,也不推荐使用这种方式,因为join方法作用和其他语言中的join一样,并不能一定影响线程执行的先后,只能说是一种增加等待的可能性


但是注意,凡是个锁,就有可能造成死锁,就是说上一个用锁的人,由于某些原因没有解开这把锁,那其他的线程就会一直等待,造成了死锁,所以大家使用锁的时候一定要注意!!!!


http://www.ppmy.cn/server/46596.html

相关文章

开发电商系统的技术选型

开发电商系统是一个复杂的任务,需要全面的技术选型来确保系统的稳定性、可扩展性和性能。本文将详细探讨在开发电商系统时涉及的各方面技术选型,包括架构设计、前端技术、后端技术、数据库选择、缓存策略、安全性、支付系统、日志和监控、以及自动化运维…

ML307R OpenCPU MQTT使用

一、函数介绍 二、示例代码 三、代码下载地址 一、函数介绍 MQTT 相关函数可以在cm_mqtt.h里面查看,一下也是里面相关的函数接口 /*** @brief 销毁mqtt client* * @param [in] client mqtt client* @return 成功返回0,失败返回-1* * @details 清除并释放client,异…

【C++】6-6 你好,输出的格式控制(对齐)

6-6 你好,输出的格式控制(对齐) 分数 10 全屏浏览 切换布局 作者 向训文 单位 惠州学院 完善程序:按示例格式输出所有分数,分数保留2位小数,分数左对齐输出在两根竖线之间 裁判测试程序样例&#xff1…

UE_地编教程_创建地形洞材质

个人学习笔记,不喜勿喷。侵权立删! 使用地形洞材质来遮罩地形上特定位置的可视性和碰撞。如要在山脉侧面创建进入洞穴的入口,此操作将非常有用。可使用地形材质和地形洞材质的相同材质,但注意:对比不使用不透明蒙版的…

CTF本地靶场搭建——基于阿里云ACR实现动态flag题型的创建

接上文,这篇主要是结合阿里云ACR来实现动态flag题型的创建。 这里顺便也介绍一下阿里云的ACR服务。 阿里云容器镜像服务(简称 ACR)是面向容器镜像、Helm Chart 等符合 OCI 标准的云原生制品安全托管及高效分发平台。 ACR 支持全球同步加速、…

HashMap与Hashtable的异同

在Java的集合框架中,HashMap和Hashtable是两个常用的基于哈希表的Map接口实现。虽然它们都提供了键值对的存储和检索功能,但在技术实现、线程安全性、性能以及使用场景等方面存在显著的差异。以下将详细阐述这两个类的异同。 一、技术难点 数据结构&am…

Halo DB 魔法之 pg_pcpu_limit

↑ 关注「少安事务所」公众号,欢迎⭐收藏,不错过精彩内容~ 前情回顾 前面已经介绍了“光环”数据库的基本情况和安装办法,今天来介绍一个新话题。 哈喽,国产数据库!Halo DB! 三步走,Halo DB 安装指引 ★ Ha…

Java学习Lambda表达式

Lambda表达式 有且只有一个未实现的方法叫做Lambda表达式,可以实现函数式编程 // 这个注解是用来检查你写的函数是否是函数式接口 FunctionalInterfaceinterface Myinterface {int sum(int a, int b);default String priteTitle(String name, int age, String sex)…