Python多线程适合I/O密集型任务但受GIL限制无法并行CPU计算;threading模块以Thread类为核心,需用start()启动、join()同步;共享数据需Lock等同步机制保障线程安全。

Python的多线程适合I/O密集型任务,比如文件读写、网络请求、用户输入等待等;但受GIL(全局解释器锁)限制,它无法真正并行执行CPU密集型计算。理解这一点,是用好多线程的前提。
threading模块的核心对象:Thread类
相比低层的_thread(已不推荐直接使用),threading更安全、功能更全。最常用的是Thread类:
- 通过target参数传入要并发执行的函数,args或kwargs传参
- 调用start()启动线程(不是直接调用run())
- 用join()阻塞主线程,等待子线程结束——常用于确保所有任务完成后再继续
共享数据与线程安全:别忘了Lock
多个线程读写同一变量(如全局计数器)时,可能因执行时序交错导致结果错误。例如两个线程同时执行count += 1,实际可能只加了一次。
- 用threading.Lock()加锁:调用lock.acquire()进入临界区,lock.release()释放(推荐配合with lock:自动管理)
- 避免死锁:按固定顺序获取多个锁;尽量缩小临界区范围;不用嵌套锁除非必要
更高级的同步工具:Event、Queue、Condition
单靠Lock不够灵活,常见场景有更合适的工具:
立即学习“Python免费学习笔记(深入)”;
- threading.Event:像一个“信号开关”,set()触发,wait()阻塞等待,适合线程间简单通知
- queue.Queue:线程安全的队列,put()/get()自动加锁,特别适合生产者-消费者模型
- threading.Condition:带等待队列的锁,支持wait()和notify(),适合需要“等待某个条件成立”的协作逻辑
守护线程与资源清理
主线程退出时,默认会等待所有非守护线程结束。若希望子线程随主线程一起退出(比如后台日志监听),可设daemon=True:
- 守护线程不能做关键资源清理(如写文件、关数据库连接),因为它可能被强制终止
- 需确保清理逻辑在主线程中完成,或使用atexit注册退出回调
- 检查线程是否存活用is_alive(),获取当前线程用threading.current_thread()










