0

0

Python 多线程共享数据的安全处理方法

冰川箭仙

冰川箭仙

发布时间:2026-02-14 21:50:03

|

862人浏览过

|

来源于php中文网

原创

多线程直接读写list或dict会导致数据错乱、崩溃或结果不一致,因其非线程安全;需用threading.lock保护临界区,queue.queue仅适用于生产者-消费者场景,threading.local则根本不共享数据。

python 多线程共享数据的安全处理方法

多线程读写同一个 listdict 会出什么问题

直接读写会导致数据错乱,比如 list.append() 看似原子,但在字节码层面其实分多步(查长度、扩容量、赋值),两个线程同时调用可能丢数据或触发 IndexError。更隐蔽的是,dict 在扩容时重哈希,若另一线程正遍历它,可能抛 RuntimeError: dictionary changed size during iteration

常见错误现象:
• 数值统计结果偏小(漏更新)
• 程序偶尔崩溃,报 KeyErrorIndexError 却找不到明确原因
• 同一输入多次运行,输出不一致

  • 别依赖“我只读不写”就认为安全——CPython 的 GIL 不保证复合操作的原子性
  • 如果只是读多写少,考虑用 threading.RLock 配合手动加锁,而不是全用 queue.Queue
  • listdict 本身不是线程安全容器,别被文档里“GIL 存在”误导

threading.Lock 保护共享变量的实操要点

锁不是加了就万事大吉。重点在临界区范围:锁太宽,性能差;锁太窄,起不到保护作用。典型错误是只锁写操作,却放任读操作裸奔。

使用场景:多个线程频繁更新同一计数器、收集日志、维护缓存状态

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

网梦购物系统
网梦购物系统

一套功能完善、性能稳定的经典网上购物系统,掌握了一整套从算法,数据结构到产品安全性方面的领先技术,使程序无论在安全性、负载能力方面均获得了成功,新版购物系统集成多种在线支付方式,全后台操作管理,并集成了Ewebedit编辑器,即使只有电脑基础知识的人也能够轻松操作和管理部分新增功能:集成多种网上支付形式,后台灵活切换增加Ewebedit编辑器,添加信息更容易!简洁、明快、新颖的界面,给人以美的感觉

下载
counter = 0
lock = threading.Lock()
<p>def increment():
global counter
with lock:  # 必须包住整个读-改-写过程
counter += 1  # 这行等价于 counter = counter + 1,含读和写</p>
  • with lock: 而非 lock.acquire()/release(),避免异常导致死锁
  • 锁对象必须是全局或跨线程可访问的同一个实例,不要在线程函数里重新创建 threading.Lock()
  • 避免嵌套锁或锁顺序不一致,否则可能死锁;如需多把锁,统一按固定顺序获取

queue.Queue 适合哪些共享数据场景

queue.Queue 是少数几个被明确声明为线程安全的内置类型,但它不是万能替代品——它解决的是“生产者-消费者”模型下的数据传递,不是通用状态共享。

适用场景:
• 任务分发(如爬虫线程从队列取 URL)
• 日志批量提交(工作线程 put,单独线程 flush 到文件)
• 避免频繁加锁的中转缓冲

  • queue.Queueput()get() 是原子的,但它的 qsize() 在多线程下不可靠,别用它做条件判断
  • 别用 queue.Queue 存大量中间状态(如整个用户 session 数据),内存和 GC 压力会明显上升
  • 如果需要“检查是否存在再取”,用 queue.get_nowait() 配合 try/except queue.Empty,而不是先 qsize() > 0

为什么 threading.local 不是共享数据方案

threading.local 的本质是为每个线程提供独立副本,根本没共享——它解决的是“如何让每个线程有自己的一份变量”,和“怎么安全共享一份变量”是相反方向。

典型误用:
• 把 local.x = [] 当作线程安全的共享列表(实际各线程操作的是不同对象)
• 试图用它汇总所有线程的结果(不可能,彼此不可见)

  • 适合场景:存储请求上下文、数据库连接、临时缓存等“本线程专用”的东西
  • 它不涉及锁、不争抢资源,所以性能好,但和“共享数据安全”完全无关
  • 如果看到别人用 local 解决“共享计数”,那大概率逻辑错了,得回看需求是不是真要共享

事情说清了就结束。真正难的不是选哪个工具,而是想明白:这个变量到底需不需要被所有线程看到?如果只需要各自算各自的,threading.local 最干净;如果必须同步状态,就得直面锁的粒度和生命周期——这里没银弹,只有权衡。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

325

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

772

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

96

2025.08.19

线程和进程的区别
线程和进程的区别

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

673

2023.08.10

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

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

325

2025.12.24

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

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

24

2026.01.21

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

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

24

2026.01.21

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

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

94

2026.02.06

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

76

2026.02.13

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.3万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.5万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号