登录
首页 >  文章 >  python教程

Python多线程\_threading模块详解

时间:2026-03-11 12:01:10 474浏览 收藏

本文深入解析了Python多线程开发的核心实践,明确指出应使用标准库中的`threading`模块而非底层的`_thread`(更不存在所谓的`_threading`模块),通过对比二者在安全性、功能完备性与易用性上的显著差异,强调`threading`是绝大多数场景下的唯一推荐选择;文章以清晰示例演示了如何创建、启动和管理线程,重点讲解了`Lock`等同步机制如何解决竞态条件,并延伸介绍`Event`、`RLock`等高级工具,同时给出I/O密集型任务适用多线程、CPU密集型应转向`multiprocessing`等关键决策建议,辅以守护线程设置、日志调试技巧和常见陷阱提醒,帮助开发者快速构建可靠、可维护的并发程序。

Python多线程入门_threading模块详解

Python中多线程主要通过threading模块实现,它比底层的_thread(旧称thread)更安全、功能更完整,是实际开发中的标准选择。所谓“_threading模块”并不存在——常见误解源于把threading误写为_threading,或混淆了_thread(C级轻量接口)与threading(面向对象高级封装)。

threading vs _thread:该用哪个?

_thread是Python的底层线程模块,提供极简的start_new_thread()allocate_lock()等函数,不支持线程对象、无法获取线程状态、没有守护线程机制,异常会直接终止整个程序。而threading基于_thread构建,封装了Thread类、LockEventQueue等工具,支持线程生命周期管理、异常隔离、资源同步,是推荐且默认使用的模块。

  • 新手和绝大多数场景 → 用 threading
  • 嵌入式或极端性能敏感且需完全控制底层行为 → 才考虑_thread(极少)
  • 不要导入_threading——它不是公开API,也不在标准库中

快速上手:创建和启动线程

最常用方式是实例化threading.Thread,传入目标函数和参数:

import threading
import time
<p>def say_hello(name, delay):
time.sleep(delay)
print(f"Hello from {name}")</p><h1>创建两个线程</h1><p>t1 = threading.Thread(target=say_hello, args=("Thread-1", 1))
t2 = threading.Thread(target=say_hello, args=("Thread-2", 0.5))</p><h1>启动线程</h1><p>t1.start()
t2.start()</p><h1>等待线程结束(可选)</h1><p>t1.join()
t2.join()
print("All done")
</p>

注意:start()才是真正启动线程;调用run()只是在当前线程同步执行,不产生并发。

线程安全与共享数据:为什么需要Lock?

多个线程同时读写同一变量(如全局计数器)时,可能因执行时序交错导致结果错误(竞态条件)。例如两个线程各自对counter += 1执行100次,最终结果可能小于200。

解决方法是用threading.Lock加锁:

counter = 0
lock = threading.Lock()
<p>def increment():
global counter
for _ in range(100):
with lock:  # 自动 acquire/release
counter += 1</p><p>t1 = threading.Thread(target=increment)
t2 = threading.Thread(target=increment)
t1.start(); t2.start()
t1.join(); t2.join()
print(counter)  # 稳定输出 200
</p>

其他同步原语如RLock(可重入锁)、Event(线程间信号)、Condition(带等待/通知的条件变量)也常用于复杂协作场景。

实用技巧与避坑提醒

  • 主线程退出时子线程默认继续运行——如需随主程序退出,设daemon=True(后台线程),但注意其不会等待完成就强制终止
  • I/O密集型任务适合多线程(如网络请求、文件读写),CPU密集型建议用multiprocessing(受GIL限制)
  • 避免用time.sleep()模拟并发逻辑测试——时序不可控;可用threading.Eventqueue.Queue做确定性协调
  • 调试多线程程序时,优先使用logging而非print——后者可能因缓冲导致输出混乱

掌握threading的核心类和同步机制,就能写出可靠、可维护的并发代码。不需要深入_thread或虚构的_threading,专注用好标准模块即可。

本篇关于《Python多线程\_threading模块详解》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>