0

0

Python threading.Thread 的底层实现原理

舞夢輝影

舞夢輝影

发布时间:2026-02-20 18:48:52

|

799人浏览过

|

来源于php中文网

原创

python的threading.thread并非os线程直封装,受gil限制,计算密集型任务无法并发;需用multiprocessing或asyncio绕过gil;start()才是合法启动入口,run()直接调用等同同步执行。

python threading.thread 的底层实现原理

Python 的 threading.Thread 不是操作系统线程的直接封装

它底层确实调用 pthread_create(Linux/macOS)或 CreateThread(Windows),但中间隔着 CPython 的 PyThread_start_new_thread 和 GIL 管理逻辑。这意味着你启动一个 threading.Thread,OS 层面会多一个线程,但 Python 字节码执行仍受 GIL 排他锁制约。

常见错误现象:time.sleep(1) 在多线程里“看起来”并发,但纯计算密集型任务(比如 sum(range(10**7)))几乎不提速——因为 GIL 始终只放行一个线程执行 Python 字节码。

  • 真正释放 GIL 的操作:I/O(read/write/recv)、部分 C 扩展(如 numpy 数组运算)、显式调用 time.sleep()
  • 想绕过 GIL?得用 multiprocessingasyncio + 非阻塞 I/O,而不是堆更多 threading.Thread
  • 注意:threading.Thread.daemon=True 的线程会在主线程退出时被强制终止,不会等待其自然结束——这常导致日志没刷盘、临时文件没清理

start()run() 的区别不是语义问题,是执行时机问题

start() 是唯一合法的线程启动入口;它负责注册线程、触发 OS 创建、调度进 GIL 等待队列。run() 只是一个普通方法,直接调用等价于同步执行——根本没开新线程。

常见错误现象:写 t.run() 代替 t.start(),结果所有逻辑串行跑完,还误以为“多线程跑完了”。调试时加 print(threading.current_thread().name) 就能立刻暴露问题。

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

XmxCms企业网站管理系统2.0
XmxCms企业网站管理系统2.0

原本这个程序只是本人两年前初学时练手的,最近拿出来进行了修改,所以叫XmxCms 企业网站管理系统2.0 开发环境:WinXP + VS2008 + SQLServer 2008 + Access开发语言:C#本程序采用 三层架构 + 抽象工厂设计模式 + Linq 实现,目前只做了Access 和 SQL Server ,默认数据库为Access,要更换数据库只需修改web.config 即可

下载
  • 永远只调 start();重写 run() 来定义线程体,别重写 start()
  • start() 只能调一次,重复调用抛 RuntimeError: threads can only be started once
  • 启动后立即查 t.is_alive() 可能返回 False——因为线程刚创建还没来得及进入运行态,建议用 t.join(timeout=0.1) 或事件机制做协调

GIL 导致的竞态条件比想象中更隐蔽

很多人以为“没共享可变对象就安全”,但 Python 中一些看似原子的操作其实不是:比如 list.append() 是原子的,但 counter += 1(等价于 counter = counter + 1)包含读-算-写三步,必然被 GIL 中断。

使用场景:多个线程更新同一个 dict 的计数器字段、往同一个 list 追加元素、修改类实例属性。

  • 别依赖“小操作很短所以不会被打断”——GIL 切换点不只在字节码边界,也发生在循环计数器溢出、信号到达等时刻
  • 最轻量的修复是用 threading.Lock 包住临界区;更推荐用线程安全类型,比如 queue.Queue 替代 listthreading.local() 隔离线程状态
  • threading.RLock 允许同一线程多次 acquire,适合递归调用场景,但性能略低,别无脑替换 Lock

线程生命周期和资源泄漏的实际表现

Python 线程退出后,OS 线程资源由系统回收,但 Python 层的 Thread 对象若没被 gc 掉,会持续持有栈帧、局部变量引用——尤其当线程函数闭包捕获了大对象时,容易引发内存缓慢上涨。

性能影响:大量短命线程(比如每秒启停上百个)会显著增加 GIL 调度开销和内存碎片;CPython 解释器本身不提供线程池复用,得靠 concurrent.futures.ThreadPoolExecutor

  • 避免在循环里反复 Thread(target=f).start();改用 ThreadPoolExecutor.submit(f) 复用线程
  • 线程函数里别留长生命周期引用:比如把全局 logger 或数据库连接传进去,不如在函数内按需获取
  • 检查 threading.enumerate() 可发现意外存活的线程,但注意它返回的是当前活跃线程快照,非实时全量视图

真正难调试的,是那些没显式 join、又没设 daemon 的线程——它们卡在 I/O 或死锁里,让主程序无法退出,还查不到堆栈。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

13

2026.02.03

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

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

420

2023.07.18

堆和栈区别
堆和栈区别

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

594

2023.08.10

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

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

420

2023.07.18

堆和栈区别
堆和栈区别

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

594

2023.08.10

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

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

675

2023.08.10

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

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

369

2025.12.24

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

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

796

2026.02.13

热门下载

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

精品课程

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

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

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

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