讲师中心 微信公众号
AI工具推荐 视频效率加速

Python多线程代码_Python多线程编程示例代码解析

冬瑶大大_9046

冬瑶大大_9046

发布时间:2026-01-22 20:08:37

|

528人浏览过

|

来源于php中文网

原创

threading.Thread不执行目标函数的主因是target传了函数调用(如my_func())而非函数引用(my_func),且主线程未调用join()导致子线程被终止;CPU密集型任务无加速源于GIL限制,应改用multiprocessing或numpy等绕过GIL的方案。

python多线程代码_python多线程编程示例代码解析

为什么 threading.Thread 启动后不执行目标函数?

常见现象是调用了 t.start(),但 target 函数毫无反应。根本原因通常是:把函数调用写成了函数引用 —— 例如传了 target=my_func()(带括号),实际应传 target=my_func(不带括号)。
另一个高频坑是主线程结束太快,子线程被强制终止(尤其在脚本末尾没加 t.join())。Python 的 threading 模块不会自动等待子线程完成。

实操建议:

  • 检查 target 参数是否为函数名本身,而非调用表达式
  • 所有启动的 Thread 实例,若需确保其执行完毕,必须显式调用 .join()
  • 避免在 target 函数中直接修改全局变量而不加锁 —— 即使看起来“只是读”,也可能因字节码交错引发意外

用 queue.Queue 在多线程间安全传数据,但程序卡死?

典型表现是生产者调用 q.put(item) 后阻塞,或消费者调用 q.get() 后永远等不到数据。这不是队列“坏了”,而是没理解 queue.Queue 的阻塞机制和配套方法语义。

关键点:

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

Python Testing
Python Testing

Python 测试速查:运行 pytest、使用 mock/patch、参数化、fixtures、异步、覆盖率测试。

下载
  • q.get() 默认阻塞,直到有数据;若确定队列非空,可加 timeout=1 避免无限等待
  • 使用 q.task_done() 必须与 q.join() 配对 —— 每次 get() 后处理完任务,就得调一次 task_done(),否则 join() 永远不会返回
  • q.empty() 和 q.qsize() 在多线程下不可靠,仅作粗略参考,不能用于条件判断逻辑

为什么 CPU 密集型任务用 threading 几乎不提速?

这是 Python 的 GIL(全局解释器锁)导致的硬限制:同一时刻只有一个线程执行 Python 字节码。所以纯计算任务(如循环累加、正则匹配大量文本、数值计算)无法通过多线程并行利用多核。

应对策略取决于场景:

  • 如果任务含 I/O(文件读写、网络请求、数据库查询),threading 依然有效 —— I/O 时 GIL 会释放,其他线程可运行
  • 若确实是 CPU 密集型,改用 multiprocessing 模块,每个进程有独立解释器和 GIL
  • 部分计算可用 numpy 或 scipy 加速 —— 它们的底层 C 实现绕过 GIL,此时多线程也能受益

调试多线程时,print 输出乱序甚至缺失?

不是 bug,是标准输出(sys.stdout)默认行缓冲 + 线程竞争的结果。多个线程同时调 print(),可能把不同线程的字符串碎片混在一起,或因缓冲未刷新而丢失。

临时解决办法(仅限调试):

  • 给 print() 加 flush=True 参数,如 print("msg", flush=True)
  • 用 logging 模块替代 —— 它线程安全,且支持格式化和输出定向
  • 更稳妥的方式是把日志内容先写入线程本地变量或 queue.Queue,由单个线程统一输出

GIL 不保证 print 原子性,这点容易被忽略 —— 即使只 print 一个变量,背后也涉及对象转换、编码、写缓冲多个步骤,中间可能被切换。

相关文章

编程速学教程(入门课程)
编程速学教程(入门课程)

编程怎么学习?编程怎么入门?编程在哪学?编程怎么学才快?不用担心,这里为大家提供了编程速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek

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

豆包大模型

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

WorkBuddy

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

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

讯飞智作

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

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

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

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

2420

2023.09.27

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

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

229

2026.02.03

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

3865

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

1590

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1578

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2324

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5824

2023.10.24

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

0

2026.09.29

热门下载

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

精品课程

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

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