Python知识点19---锁

embedded/2024/11/9 16:58:11/

提前说一点:如果你是专注于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/embedded/46101.html

相关文章

HTML基本元素包含HTML表单验证

可将以下代码复制另存为一个HTML文件浏览器打开自己去看看实际使用效果 <!DOCTYPE html> <html> <head> <meta charset"utf-8"><title>测试</title> </head> <body> <h1>很多事</h1> <h1><b&…

3. MySQL 数据表的基本操作

文章目录 【 1. MySQL 创建数据表 】【 2. MySQL 查看表 】2.1 查看表的属性DESCRIBE/DESC 以表格的形式展示表属性SHOW CREATE TABLE 以SQL语句的形式展示表属性 2.2 查看表的内容 【 3. MySQL 修改数据表结构 】3.1 修改表名3.2 修改表字符集3.3 添加字段在末尾添加字段在开头…

Flutter基础 -- Dart 语言 -- 类抽象接口继承函数库

目录 1. 类 class 1.1 定义、使用类 1.2 构造函数 1.3 初始化列表 1.4 命名构造函数 1.5 重定向构造函数 1.6 callable 2. 类 get set 2.1 定义、使用 get set 2.2 简化 get set 2.3 业务场景 3. 静态 static 3.1 static 定义 3.2 函数内部访问 3.3 静态方法 3…

Linux下Qt Creator无法输入中文(已解决)

1. 首先确保安装了搜狗输入法&#xff0c;且能正常运行。 2.克隆源码到本地。 git clone https://gitcode.com/fcitx/fcitx-qt5.git 3.检查Qt Creator版本&#xff0c;如下图所示&#xff0c;为基于Qt6的。 4. 进入源码目录&#xff0c;建立build文件夹&#xff0c;修改CMak…

python导出手机可执行

流程&#xff1a; 梦想->安装打包工具->编写程序->生成打包配置->执行打包命令->生成手机可执行文件->OK完成梦想 步骤1&#xff1a;安装打包工具 # 安装PyInstaller pip install pyinstaller 步骤2&#xff1a;编写Python程序 接下来&#xff0c;你需要编…

[论文笔记]MemGPT: Towards LLMs as Operating Systems

引言 今天介绍一篇论文MemGPT: Towards LLMs as Operating Systems。翻过过来就是把LLM看成操作系统。 大语言模型已经在人工智能领域引起了革命性的变革&#xff0c;但受到有限上下文窗口的限制&#xff0c;在扩展对话和文档分析等任务中的效用受到了阻碍。为了能够利用超出…

【刷题(12)】图论

一、图论问题基础 在 LeetCode 中&#xff0c;「岛屿问题」是一个系列系列问题&#xff0c;比如&#xff1a; 岛屿数量 &#xff08;Easy&#xff09;岛屿的周长 &#xff08;Easy&#xff09;岛屿的最大面积 &#xff08;Medium&#xff09;最大人工岛 &#xff08;Hard&…