Python线程锁

news/2025/11/3 20:42:27/文章来源:https://www.cnblogs.com/ylifs/p/19188272

多线程用于IO、网络请求等地方,只要不是CPU密集型,都可以直接使用多线程。

线程锁在代码中发挥着关键的保护作用,让我详细解释它的工作原理:

锁的作用机制

1. 基本工作原理

with lock:if ensp_id in ensp_to_seq:return True

执行流程

  • 线程A进入with lock:块,获取锁
  • 线程A检查ensp_id是否在字典中
  • 在此期间,线程B尝试进入同一个with lock:块,但被阻塞等待
  • 线程A完成检查后退出with块,自动释放锁
  • 线程B现在可以获取锁并进入临界区

2. 为什么需要锁?

没有锁的情况(竞态条件)

# 线程A检查 ensp_id 不在字典中
if ensp_id not in ensp_to_seq:  # 假设此时不在# 在线程A发起请求前,线程B也检查同一个ensp_id
# 线程B也发现不在字典中,也发起请求# 结果:同一个ensp_id被请求了两次!

有锁的情况

with lock:if ensp_id in ensp_to_seq:  # 线程A检查,获取锁return True# 线程A释放锁,发起请求...# 线程B必须等待线程A完成检查才能进入

3. 完整的线程安全流程

def get_ensembl_sequence(ensp_id: str):# 第一步:检查是否存在(需要锁保护)with lock:if ensp_id in ensp_to_seq:  # 原子性操作return True# 第二步:网络请求(不需要锁,可以并行执行)headers = {"Content-Type": "text/x-fasta", "Accept": "text/x-fasta"}try:response = requests.get(url, headers=headers)response.raise_for_status()seq = response.text.strip()seq = "".join(seq.split("\n")[1:])# 第三步:写入结果(需要锁保护)with lock:ensp_to_seq[ensp_id] = seq  # 原子性操作print(len(ensp_to_seq))return Trueexcept:return False

关键点:锁确保了检查-写入操作的原子性,避免了竞态条件,保证了数据的一致性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/954877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

若依前端验证码的实现

由于之前没时间,现在重新写一份 好吵啊,游戏人的吼叫声,嗓门太大了 有钱了买个好的耳机 详细视频讲解:https://www.bilibili.com/video/BV1HT4y1d7oA?spm_id_from=333.788.player.switch&vd_source=886219f6fb…

从O(n)到O(n):Python字符串拼接的效率陷阱与最佳实践

从O(n)到O(n):Python字符串拼接的效率陷阱与最佳实践 在Python开发中,字符串拼接是最常见的操作之一。但看似简单的+号拼接,在循环场景下可能埋下严重的性能隐患。本文通过两段代码的对比,拆解字符串拼接的效率差异…

实验4:MobileNet ShuffleNet - OUC

实验4:MobileNet & ShuffleNet 姓名: 学号:姓名和学号?本实验属于哪门课程? 中国海洋大学25秋《软件工程原理与实践》实验名称? 实验4:MobileNet & ShuffleNet博客链接:学习要求CNN的基本结构:卷积、…

模拟赛 31

T1简单题,排序后直接枚举两个有画面格子之间的间隔数,即为可能节省的行数或列数,移动次数也易求。点击查看代码 #include<bits/stdc++.h> #define MAXN 500005 #define int long long const int inf=1e18; us…

CSP-S 2025 T3 小结

这个主要是写给自己看的。 就是观察到 b 性质是个扫描线。 考虑加强,会发现把 trie 树套上去就没了。 前面的思路不难想,主要是最后一步。 代码: #include<bits/stdc++.h> #include<bits/extc++.h> usi…

第三十二篇

今天是11月3号,进行期中考试了,难

2025年苏州AIGEO 优化服务商深度测评:TOP5 企业核心优势与实战案例对比

这份 GEO 优化服务商榜单与实践指南,既提供了可直接对标选择的优质服务商,也拆解了不同行业的定制化策略与落地路径。对企业而言,GEO 优化不再是单一的技术操作,而是 AI 时代品牌抢占流量入口、传递核心价值的关键…

使用 Docker Compose 轻松实现 INFINI Console 离线部署与持久化管理

本文是 INFINI Console 环境搭建系列的第四篇,专为需要在离线或内网环境中容器化部署 INFINI Console 与 Easysearch 的用户设计。系列回顾与引言 在我们的 INFINI 本地环境搭建系列博客中:第一篇《搭建持久化的 INF…

第6章 语句

6.5 if语句悬垂else (dangling-else) 问题:当一个if子句多于else子句时,对于每一个else,究竟属于哪个if。 C++中会将else匹配给最后出现的尚未匹配的if子句。

十一月杂题

十一月杂题1. CF1067D Computer Game 考虑有了一次升级机会之后一定只会对着期望收益最高的做。于是只需要决策升级之前的决策。设 \(f_t\) 为还剩 \(t\) 秒的最大收益,\(x\) 为期望收益最大的任务的期望收益,则有 \…

Modbus RTU 通信格式详解学习笔记

看似与人为善、心肠柔软之人,必然有一块坚硬如铁的心境土壤,在苦难人生中,死死支撑着那份看似愚蠢的善意1️⃣ 核心思想:Modbus RTU 报文 = 一封结构化的“电报” 想象一下,你要给朋友发一封电报:你得先告诉邮局…

Selenium3+Python3 自动化项目项目实战day1

HTML CSS JavaScript HTMl总体脉络 CSS皮肤组织 JavaScript二者神经组织 HTML 超文本标记语言 HTMl元素 HTML表单 CSS JaveScript

P1.python环境的配置和安装

P1.python环境的配置和安装1.1CUDA安装: 1.查看CUDA Version 在终端输入nvidia-smi2.下载安装配置CUDA1.2python3.8安装 C:\Users\ASUS\AppData\Local\Programs\Python\Python381.3Anaconda安装 1.软件下载安装测试一…

Python 中可变对象的“引用赋值”特性——可变对象的“引用传递”

一、踩坑代码 某程序老鸟讲了一个故事: “2019年夏天,我在做一个推荐系统的用户画像模块。当时写了这样的代码: # 当时的蠢代码,现在想起来都脸红 default_preferences = [] # 想着所有用户共享一个默认偏好 user…

CSP-S 2025 游寄喵

使用了新的文风喵……希望能缓解气氛喵……poi 酱写下这篇游记的时候大概心态很炸喵……不过还是尽量收住了我的垃圾情绪喵,如果不慎伤到您的话欢迎指出喵……poi 酱谢罪喵……(跪着) 如果您有帮到 poi 酱没有 ack …

Modbus协议分类及测试学习笔记

只是两个人相处,那么喜欢一个人,可能会觉得她所有都好,但是以后在一起了,就要学会喜欢她的不好。记住,Modbus不是一种协议,而是一套“通信规则”,它可以在不同的“交通工具”上运行 1️⃣ 核心思想:Modbus是“…

MarkDown初入

MarkDown学习 标题 几个“#”后+一个空格,就是几级标题,最多6级 文字修饰 Hello,Word! 前后+”**“是+粗 一个”*“斜体 三个就是全都要 双波浪就是划掉 Hello,Word! Hello,Word! Hello,Word! 引用学习狂神教…

英语_作文_8AU3_Curiosity

Curiosity is one of the most important qualities the human have.It let us have ability to explore the unknown. We always asked "why", even we found our question‘s answers surpringly and amaz…

习题-极大原理

习题1. 若\(a\)和\(b\)是两个实数,当\(b-a\)为正有理数时定义\(a\prec b\),证明这是\(\mathbb{R}\)上的一个严格偏序。它的极大全序子集是什么?2. (a) 设\(\prec\)是集合\(A\)中的一个严格偏序,\(A\)中的一个关系\…

极大原理

我们已经说过,由选择公理可以得到任意集合都能良序化这一深刻的定理。在数学中,选择公理还有更加重要的推论。这里所提及的“极大原理”有多种版本。在1914年至1935年间,多位数学家曾对极大原理独立地予以论述,他们…