news 2026/9/7 21:27:17

python的多线程编程之锁

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python的多线程编程之锁

1、 背景概述

上篇文章里, 着重叙说了编程的某些基本方面, 然而其中欠缺有关锁的相关概念, 所以在这篇文章里予以补充。

因为存有GIL, 即全局解释器锁, 所以每次获取CPU时, 仅有一个线程能够获取CPU运行权, 并在这方面被视作线程安全。然而在线程运行期间, 它可共享内存, 并具备一致的数据信息内容;如此这般, 此时的线程便不再那么安全了。

在其中, 需确保数据的准确无误, 而且要由自身来把控数据, 要针对数据施行加锁操作, 并且由自身去释放那一锁。

主要目的成了多线程往不太相关方向使用以提升使用效果, 比如爬虫时, 能借助它来抓取, 因线程间不存在需共同处理的数据, 所以抓取时使用它是最佳的 , 也就是为了提高性能与速度。

如果需要操作同一份数据,那么必须自己保证数据的安全性。

要是存在利用多cpu特性的诉求, 那应当采用的是多进程编程, 而非多线程编程, 多进程编程是这样的。

2、 利用锁进行同步相同的数据

直接看以下的代码:

#!/usr/bin/env python import time import threading num = 0 class MyThread(threading.Thread): def run(self): #lock.acquire() #time.sleep(1) global num num += 1 print self.name + 'set num to '+str(num) #lock.release() #lock = threading.RLock() threads = [] for i in range(10000): t = MyThread() threads.append(t) for i in range(10000): threads[i].start() for i in range(10000): threads[i].join()

瞧一瞧上面所呈现的代码, 针对全局变量开展一处修改, 借此使得每个线程获取到的皆是同一份的数据, 由此一来, 极有可能致使数据的计算结果出现不正确的状况, 故而, 必须借助锁去把控数据的正确性。

需注意, 于我的机器上展开运行操作时, 均为正确的情形, 进而像是即便不用锁也能够达成, 然而在部分机器上开展模拟操作时, 最终的计算结果却并非正确的。

在使用锁的时候,只要将注释的代码进行去掉即可使用锁。

3、 锁的类型

在的模块中,提供了三种锁,如下所示:

做锁的操作期间, 于每个线程, 要自行去获取锁, 其后还得自己去释放锁, 不然的话会致使一直处于等待状态, 这也能够称作死锁。

4、 事件

以线程来做事情时, 能够去断定一个事件已然出现, 接下去促使触发去开展另有别样的事宜, 如此一来能借助event, 像下面呈现的代码那样呢:

[root@python 523]# cat thread_demo.py #!/usr/bin/env python import threading import time import Queue def producter(name,queue,lock): event.clear() print '%s start to product...' % name queue.put('something') time.sleep(3) print 'product something' event.set() event.wait() def consumer(name,queue,lock): print '%s start to consume...' % name event.wait() queue.get() print 'consume something' event.set() lock = threading.Lock() queue = Queue.Queue(10) event = threading.Event() threads = [] threadsc = [] for i in range(1): t = threading.Thread(target=producter,args=('kel%s' % i,queue,lock)) threads.append(t) for i in range(1): threads[i].start() for i in range(1): t = threading.Thread(target=consumer,args=('smile%s' % i,queue,lock)) threadsc.append(t) for i in range(1): threadsc[i].start()

当运用event之际, clear的意思是把flag设定成false, set的意思是设定成true, wait的意思是在flag为false时, 持续等候, 进而在尚无数据时, 始终进行等待。

这种可以做事件的触发。

问题:

于开展此实验之际, 要是线程产生错误, 可不那么能够关闭, 进而唯有杀掉进程才行, 进而能够运用如下命令:

killall python

把进程给杀掉之际, 线程也一并杀掉, 然而, 线程是没办法被杀死的, 虽然能够使得进程遭受杀害处理。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/7 21:26:53

基于Python3与pynput的跨平台GUI自动化测试脚本录制与代码生成工具

这套系统以该工具集为中心, 采用的是核心开发语言, 深度整合了库, 从而构建出一套全功能自动化操作支撑系统, 此系统面向软件质量保障以及办公效能提升。它的核心能力汇聚在这样一个闭环: “人机交互行为的数字化捕获, 结构化建模, 可编程复现, 工程化部署”, 实际上达成了GUI层…

作者头像 李华
网站建设 2026/9/7 21:26:34

平台型公司 vs 项目型公司:三剑客谁在构建真正的飞轮效应?所有产业的终极分水岭,从来不是短期订单体量,而是增长是否具备自我复利的飞轮效应。

平台型公司 vs 项目型公司:三剑客谁在构建真正的飞轮效应?所有产业的终极分水岭,从来不是短期订单体量,而是增长是否具备自我复利的飞轮效应。视频孪生、空间智能赛道进入终局博弈阶段,行业彻底分化为两种截然不同的增…

作者头像 李华
网站建设 2026/9/7 21:25:46

2026巴哈大赛车检表解析:预检查与电池箱设计避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/7 21:24:29

GAN 很复杂?如何用不到 50 行代码训练 GAN(基于 PyTorch)

本文的作者是曾经身为谷歌高级工程师的、AI初创公司的创始人兼CTO Dev Nag, 讲述了他运用不到五十行代码于平台上达成对GAN训练的方式途径, 是经由雷锋网进行编译整理的。Dev Nag什么是 GAN?在步入技术层面以前, 为了关照刚入门的开发者, 雷锋网先进而来介绍一下什么…

作者头像 李华
网站建设 2026/9/7 21:21:52

统信UOS下IDEA双击无反应?从启动链路到环境变量全排查指南

你有没有遇到过这样的情况:在统信UOS桌面版上装好了IDEA,双击桌面图标,鼠标指针转了两圈,然后就没了任何反应。任务栏上没有窗口,进程管理器里也看不到Java进程,再双击还是这样。我刚开始接触统信UOS的时候…

作者头像 李华
网站建设 2026/9/7 21:21:39

基于Hadoop+Spark+Hive的租房推荐系统与可视化大屏实现

做数据方向的朋友应该都遇到过这类需求:老板丢过来一堆房源数据,说“搞个推荐系统,顺便做个可视化大屏看看行情”。听起来简单,真做起来涉及数据采集、清洗、存储、计算、推荐、展示一整条链路,哪个环节都能把人折腾到…

作者头像 李华