当前位置: 首页 > news >正文

Python线程锁

多线程用于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.jsqmd.com/news/30389/

相关文章:

  • 若依前端验证码的实现
  • 从O(n)到O(n):Python字符串拼接的效率陷阱与最佳实践
  • 实验4:MobileNet ShuffleNet - OUC
  • 模拟赛 31
  • CSP-S 2025 T3 小结
  • 第三十二篇
  • 2025年苏州AIGEO 优化服务商深度测评:TOP5 企业核心优势与实战案例对比
  • 使用 Docker Compose 轻松实现 INFINI Console 离线部署与持久化管理
  • 第6章 语句
  • 十一月杂题
  • Modbus RTU 通信格式详解学习笔记
  • Selenium3+Python3 自动化项目项目实战day1
  • P1.python环境的配置和安装
  • Python 中可变对象的“引用赋值”特性——可变对象的“引用传递”
  • CSP-S 2025 游寄喵
  • Modbus协议分类及测试学习笔记
  • MarkDown初入
  • 英语_作文_8AU3_Curiosity
  • 习题-极大原理
  • 极大原理
  • P7. TensorBoard的使用(一)
  • 二分搜索优化DP(子序列问题)
  • 如何从手机内部恢复数据?2025年9大最佳手机数据恢复软件
  • 如何将数据从 Mac 硬盘恢复数据到电脑:所有方法
  • 接口编号
  • Windows 10操作技巧:如何在 Windows 10 中恢复永久删除的文件
  • Mac数据恢复:Mac 十大数据恢复软件详细评测
  • iPad照片、联系人、笔记恢复工具: iPad 数据恢复软件
  • 2026 年预估适用于 Windows 10_11 的 10 款最佳数据恢复软件
  • 2025 年 9 款最佳 PDF 文档管理编辑工具