1. 为什么需要线程?
在Python中,线程(Thread)是最基础的并发编程方式之一。想象你正在经营一家餐厅:如果只有一个服务员(单线程),他需要依次完成点餐、上菜、结账等所有工作,效率显然低下。而引入多个服务员(多线程)后,不同顾客的需求可以同时被处理,这就是线程的核心价值。
我曾在处理一个网络爬虫项目时,单线程下载1000个页面需要近2小时,而使用10个线程后,时间缩短到12分钟左右。这种性能提升在I/O密集型任务中尤为明显,因为线程可以在等待网络响应时释放CPU资源给其他线程使用。
注意:Python中的线程由于GIL(全局解释器锁)的存在,并不适合CPU密集型任务。对于计算密集型场景,建议考虑多进程(multiprocessing)或C扩展。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 线程基础操作
2.1 创建与启动线程
Python标准库提供了threading模块,创建线程有两种常用方式:
python复制import threading
import time
# 方式1:直接实例化Thread类
def task(name):
print(f"{name}开始执行")
time.sleep(1)
print(f"{name}执行完成")
t1 = threading.Thread(target=task, args=("线程1",))
t1.start()
# 方式2:继承Thread类
class MyThread(threading.Thread):
def run(self):
print("自定义线程执行")
time.sleep(2)
print("自定义线程结束")
t2 = MyThread()
t2.start()
实际项目中,我推荐第一种方式,因为它更符合Python的鸭子类型哲学,且避免了不必要的类继承。但第二种方式在需要封装复杂线程逻辑时会更清晰。
2.2 线程的生命周期
一个线程会经历以下状态变化:
- 新建(New):创建Thread对象但未调用start()
- 就绪(Runnable):调用start()后等待CPU调度
- 运行(Running):正在执行任务
- 阻塞(Blocked):等待I/
