0

0

Python 线程死锁的形成与排查

舞夢輝影

舞夢輝影

发布时间:2026-01-29 18:46:02

|

934人浏览过

|

来源于php中文网

原创

死锁发生于多线程中锁获取顺序不一致,如thread_a持lock1等lock2、thread_b持lock2等lock1,导致双方永久阻塞;需固定加锁顺序、设timeout、加锁命名便于排查。

python 线程死锁的形成与排查

死锁是怎么发生的(以 threading.Lock 为例)

死锁不是 Python 特有,但在线程频繁争抢共享资源时极易触发。典型场景是两个线程各自持有一个锁,又同时去申请对方持有的锁:thread_a 持有 lock1 并等待 lock2thread_b 持有 lock2 并等待 lock1——双方永远卡住。

关键点在于:锁的获取顺序不一致、未设置超时、锁粒度不合理。

  • 常见错误现象:threading.Thread 启动后程序无响应,CPU 占用低,Ctrl+C 无法中断(因主线程也在等锁)
  • 使用场景:多线程更新全局字典、操作共享队列、数据库连接池复用
  • 避免方式:始终按固定顺序获取多个锁(如按变量名排序),或改用 threading.RLock(仅适用于单线程重入,不解决跨线程死锁)

如何快速定位死锁线程(用 threading.stack_size 和 sys._current_frames)

Python 不提供原生死锁检测,但可通过强制 dump 当前所有线程的调用来判断卡在哪个锁上。

实操建议:

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

MallWWI新模式返利商城系统
MallWWI新模式返利商城系统

MallWWI新模式返利商城系统基于成熟的飞蛙商城系统程序框架,支持多数据库配合,精美的界面模板,人性化的操作体验,完备的订单流程,丰富的促销形式,适合搭建稳定、高效的电子商务平台。创造性的完美整合B2B\B2C\B2S\C2B\C2C\P2C\O2O\M2C\B2F等模式,引领“互联网+”理念,实现商家联盟体系下的线上线下全新整合销售方式,独创最流行的分红权返利与排队返钱卡功能。安全、稳定、结构

下载
  • 在疑似卡死时,发送 SIGUSR1(Linux/macOS)或用 py-spy record 工具抓栈;Windows 下可改用 sys._current_frames() 手动打印
  • 重点看每个线程是否停在 lock.acquire()condition.wait()queue.get() 等阻塞调用处
  • 对比多个线程的锁持有关系:谁 hold 了哪个 threading.Lock 实例?谁在等它?

示例片段(调试用):

import threading
import sys
import traceback

def dump_threads():
    for thread_id, frame in sys._current_frames().items():
        print(f"Thread {thread_id}:")
        traceback.print_stack(frame, limit=5)

threading.Condition 和 queue.Queue 的隐式死锁风险

threading.Condition 依赖底层锁,若 wait() 前未正确 acquire(),或 notify() 后未及时 release(),会导致等待线程永远挂起。同理,queue.Queueget() / put()maxsize 设为 0 或过小时,可能因生产者/消费者节奏不匹配而集体阻塞。

  • 常见错误:在 with condition: 块外调用 condition.notify(),导致通知丢失
  • 参数差异:queue.Queue(maxsize=0) 表示无限队列,但 maxsize=1 且生产者未消费时,第二个 put() 就会阻塞
  • 性能影响:过度依赖 Condition.wait(timeout=...) 而不检查条件变量本身,可能掩盖逻辑缺陷

用 timeout 参数和 try/except 防御性加锁

所有阻塞式锁操作都应设 timeout,否则一旦逻辑出错,死锁就不可逆。

  • lock.acquire(timeout=2) 返回 False 而非无限等待,便于记录日志并主动退出
  • queue.Queue.get(timeout=1)queue.Queue.put(timeout=1) 同样适用
  • 注意:timeout 是浮点秒数,设为 0 表示非阻塞(立即返回 True/False 或抛 queue.Empty/queue.Full
  • 容易被忽略的是:超时后必须显式处理“未拿到锁”的状态,比如跳过后续操作、重试或降级为单线程执行

死锁排查最耗时的环节往往不是发现现象,而是确认哪几个线程在互相等待哪几个锁实例——尤其当锁来自不同模块、命名不清晰时。建议给每个 threading.Lock 实例加可读的 __name__ 属性或注释,方便 dump 时识别。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
堆和栈的区别
堆和栈的区别

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

397

2023.07.18

堆和栈区别
堆和栈区别

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

575

2023.08.10

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

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

503

2023.08.10

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

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

166

2025.12.24

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

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

15

2026.01.21

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

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

15

2026.01.21

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

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

166

2025.12.24

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

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

15

2026.01.21

clawdbot ai使用教程 保姆级clawdbot部署安装手册
clawdbot ai使用教程 保姆级clawdbot部署安装手册

Clawdbot是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

19

2026.01.29

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8万人学习

Git 教程
Git 教程

共21课时 | 3.1万人学习

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

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