讲师中心 微信公众号

工具推荐

视频效率加速
updream

一键生成高质量推广成片

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Laper
Laper

剧本策划到成片协作

AniShort
AniShort

AI短剧协同制作平台

Python 并发安全的计数器实现

风强小哥_1857

风强小哥_1857

发布时间:2026-02-14 22:57:12

|

692人浏览过

|

来源于php中文网

原创

threading.Lock是最直接的解法,因其能强制串行化临界区以解决GIL下复合操作非原子性问题;需共享锁实例、用with语法、细粒度加锁,且asyncio中须换用asyncio.Lock。

python 并发安全的计数器实现

为什么 threading.Lock 是最直接的解法

Python 的全局解释器锁(GIL)不能保证复合操作的原子性,比如 counter += 1 实际拆成读、加、写三步,多线程下极易丢更新。用 threading.Lock 能强制串行化临界区,简单可靠。

实操建议:

  • 锁对象必须是全局或共享实例,不能在每次调用里新建 threading.Lock()
  • 务必用 with lock: 语法,避免忘记 release() 导致死锁
  • 锁粒度要细——只包住真正需要保护的语句,比如只包 self._value += 1,别把日志或网络请求也塞进去

示例:

import threading
<p>class Counter:
def <strong>init</strong>(self):
self._value = 0
self._lock = threading.Lock()</p><pre class="brush:php;toolbar:false;">def inc(self):
    with self._lock:  # ✅ 正确:自动 acquire/release
        self._value += 1
    return self._value

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

asyncio 场景下不能用 threading.Lock

协程不是线程,threading.Lock 在 async 函数里会阻塞整个事件循环,导致并发退化为串行。必须换用 asyncio.Lock。

常见错误现象:

Biopython
Biopython

全面的分子生物学工具集。适用于序列操作、文件解析(FASTA/GenBank/PDB)、系统发育分析,以及通过 Bio.Entrez 以编程方式访问 NCBI/

下载
  • 用了 threading.Lock 包裹 await 调用,程序卡住或报 RuntimeError: await wasn't used with future
  • 多个协程同时等待同一个 threading.Lock,实际变成排队执行,吞吐量骤降

实操建议:

  • asyncio.Lock 必须在协程内用 async with lock:,不能和 threading.Lock 混用
  • 初始化时要确保在事件循环已启动的上下文中(比如不能在模块顶层直接 asyncio.Lock())
  • 如果计数器还要被同步代码访问,就得拆成两套逻辑,或统一用线程安全基类 + 额外同步机制

AtomicInteger 类不存在,别被 Java 习惯带偏

Python 标准库没有类似 Java 的 AtomicInteger,也没有内置原子加法指令。有人试图用 ctypes 或 _thread 模拟,结果往往更慢、更难 debug,还破坏可移植性。

为什么不用这些“高级”方案:

  • ctypes.c_long 加 threading.Lock 包裹,性能反而比纯 Python 对象差(额外类型转换开销)
  • _thread.atomic_add 是假的——CPython 内部没有暴露该接口,第三方包如 atomic 实际仍是基于锁封装
  • NumPy 的 np.add.at 或 threading.local 不解决跨线程共享计数问题,只是转移了竞争点

结论:老实用 threading.Lock 或 asyncio.Lock,清晰、可测、无隐藏陷阱。

测试并发安全不能只靠 time.sleep()

手写 for 循环起一堆线程,再加 time.sleep() 模拟调度,根本压不出竞态。真实问题往往在高并发短任务下才暴露,比如 1000 线程抢 10 次 increment。

有效验证方式:

  • 用 concurrent.futures.ThreadPoolExecutor 提交大量小任务,比如 500 线程各执行 100 次 inc(),最后检查总数是否等于 50000
  • 配合 threading.active_count() 和 logging.debug 打点,确认锁确实被争用(而非单线程跑完)
  • 在 CI 中重复运行 100 次,失败一次就红,别信“本地试了几次都对”

容易被忽略的是:测试环境 CPU 核心数、Python 版本(3.12 引入 per-interpreter GIL)、甚至是否开了 faulthandler 都会影响竞态复现概率。

热门AI工具

更多
咔片AIPPT

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

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

DeepSeek

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

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

WorkBuddy

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

SoundView
SoundView Hot

SoundView是一款面向跨境电商的视频翻译、配音和本地化 AI 创作平台。

豆包大模型

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

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3248

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5469

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3909

2025.12.29

java接口相关教程
java接口相关教程

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

506

2026.01.19

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

7007

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2868

2023.08.10

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

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

4858

2023.08.10

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

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

1369

2025.12.24

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

热门下载

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

精品课程

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

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