讲师中心 微信公众号

工具推荐

视频效率加速
剧云
剧云

中文短剧剧本制作平台

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Seko
Seko

AI短剧一键生成成片

Laper
Laper

剧本策划到成片协作

Python 如何安全地在多线程里使用 dict(不加锁的情况下)

夜辰君_3231

夜辰君_3231

发布时间:2026-01-23 20:41:02

|

814人浏览过

|

来源于php中文网

原创

Python dict多线程读安全但写必须加锁,因GIL不保证多字节码操作原子性;推荐用RLock防嵌套死锁,或改用threading.local、queue.Queue等真正线程安全方案。

python 如何安全地在多线程里使用 dict(不加锁的情况下)

多线程读 dict 是安全的,但写操作必须加锁

Python 的 dict 在 CPython 中对纯读操作(如 get()、in、keys())是线程安全的,因为 GIL 会保证字节码级原子性;但任何修改行为(__setitem__、pop()、clear()、update())都可能触发 rehash,导致内部结构不一致甚至崩溃。这不是“大概率出错”,而是“只要并发写就可能 segfault”——CPython 3.12 之前已多次复现过。

  • 只读场景(如配置缓存)可直接共享 dict,无需额外同步
  • 哪怕只是 d[k] = v 和 del d[k] 交替执行,也必须加锁
  • dict.copy() 或 dict(d) 创建新副本是线程安全的,但副本本身不解决原始 dict 的并发写问题

用 threading.RLock 而不是 Lock 防止死锁

如果 dict 操作逻辑嵌套调用(比如一个函数更新 dict 后又调用另一个也更新 dict 的函数),用普通 Lock 会导致同一线程重复 acquire 阻塞。这时候 RLock 允许同一线程多次 acquire,只要对应次数 release 即可。

from threading import RLock
<p>shared_dict = {}
dict_lock = RLock()</p><p>def safe_set(key, value):
with dict_lock:
shared_dict[key] = value</p><p>def safe_update(other_dict):
with dict_lock:
shared_dict.update(other_dict)  # 这里可能递归调用 safe_set,RLock 更稳妥

考虑 concurrent.futures.ThreadPoolExecutor + 不可变数据流

更彻底的规避方式是放弃共享 dict:让每个线程处理独立数据,最后由主线程汇总。这比加锁更易验证、无锁竞争开销,且天然避免 ABA 或迭代中修改等陷阱。

Python Hardener
Python Hardener

通过完整的安全审查、代码整洁重构、健壮的错误处理、正确的日志记录以及完整的文档字符串覆盖,强化 Python 脚本。

下载
  • 用 executor.map() 分发任务,返回结果列表,再用 dict() 或 functools.reduce() 合并
  • 若必须边跑边聚合,可用 queue.Queue(它内部已加锁)收集中间结果
  • 避免在 worker 中直接操作全局 dict,哪怕加了锁,也会成为性能瓶颈

dict 不是线程安全容器,别被 GIL 欺骗

GIL 只保护单个字节码指令不被中断,并不保证多字节码操作(如 d[k] = v 实际是 STORE_SUBSCR,涉及哈希计算、桶查找、可能的扩容)的原子性。官方文档明确将 dict 列为“not thread-safe for mutation”。真正安全的并发字典替代方案只有:threading.local()(每线程独立)、queue.Queue(带锁队列)、或第三方库如 pyrsistent.pmap(持久化不可变映射)。

立即学习“Python免费学习笔记(深入)”;

最容易被忽略的是:即使你只用 setdefault() 或 get(key, default),只要 default 是可变对象且被多个线程共享引用,仍可能引发数据竞争——锁保护的是 dict 结构,不是其中的值。

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4818

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

1349

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

443

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

599

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

449

2026.02.06

C++多线程并发控制与线程安全设计实践
C++多线程并发控制与线程安全设计实践

本专题围绕 C++ 在高性能系统开发中的并发控制技术展开,系统讲解多线程编程模型与线程安全设计方法。内容包括互斥锁、读写锁、条件变量、原子操作以及线程池实现机制,同时结合实际案例分析并发竞争、死锁避免与性能优化策略。通过实践讲解,帮助开发者掌握构建稳定高效并发系统的关键技术。

273

2026.03.16

Java 多线程与并发编程实战
Java 多线程与并发编程实战

深入讲解 Java 并发编程体系,涵盖 Thread / Runnable / Callable 线程创建方式、线程生命周期与状态转换、synchronized 同步锁与 Lock/ReentrantLock 显式锁、volatile 可见性保证、ThreadPool 线程池配置与调优(核心参数/拒绝策略)、JUC 并发工具类(CountDownLatch/CyclicBarrier/Semaphore/ConcurrentHashMa

389

2026.04.17

C++ 多线程使用教程大全
C++ 多线程使用教程大全

系统讲解 C++11 及后续标准引入的多线程编程能力,涵盖 std::thread 线程创建与生命周期管理、std::mutex / shared_mutex 互斥锁与读写锁、std::condition_variable 条件变量同步、std::atomic 原子操作与内存序(memory_order)、std::future / promise / async 异步任务、线程池的设计与实现、死锁检测与避免策略,帮助开发者编写正确高效

256

2026.04.28

Go-Zero零基础入门教程
Go-Zero零基础入门教程

本专题整理Go-Zero的入门知识,从框架定位、环境准备到跑通第一个API服务,讲清目录分层、配置加载、日志与中间件的基本用法,并对比Gin、Kratos的差异,帮助Go开发者建立整体认知,判断它是否适合当前项目。

0

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn