0

0

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

月夜之吻

月夜之吻

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

|

508人浏览过

|

来源于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免费学习笔记(深入)”;

ecshop
ecshop

本版本全面兼容php5.6+,并且修复了许多官方程序的低级代码bug。在apache 2.4.17+php5.6.15环境下测试通过,人格保证无毒无木马,仅仅是一名ecshop热爱者心血来潮之作。ecshop编译更新日志:1、加入最新官方补丁。2、修改数据库连接底层为mysqli, 现在完美无缺了。3、再次对所有代码进行细节修复。4、adminers更新至1.1.2, 在线管理数据库的神器。5、测

下载
  • 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
  • 部分计算可用 numpyscipy 加速 —— 它们的底层 C 实现绕过 GIL,此时多线程也能受益

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

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

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

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

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

热门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的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

18

2026.02.03

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

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

93

2025.09.18

python 全局变量
python 全局变量

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

106

2025.09.18

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

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

760

2023.08.03

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

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

220

2023.09.04

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

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

1565

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

649

2023.11.24

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

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

精品课程

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

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

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

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