博客导语
Python多线程是IO密集任务最优解之一,新手最容易踩的坑:主线程提前退出、子线程乱序执行、不知道join阻塞原理。本文手把手讲解线程两种创建方式、守护线程、线程等待、执行顺序底层机制。
一、线程创建两种标准方式
1. 函数式创建(简单任务首选)
import threading import time def task(name): print(f"子线程 {name} 开始执行") time.sleep(2) print(f"子线程 {name} 执行结束") if __name__ == "__main__": t1 = threading.Thread(target=task, args=("线程1",)) t2 = threading.Thread(target=task, args=("线程2",)) t1.start() t2.start()2. 类继承创建(复杂任务首选)
class MyThread(threading.Thread): def __init__(self,name): super().__init__() self.name = name def run(self): print(f"子线程 {self.name} 运行") time.sleep(2) t = MyThread("自定义线程") t.start()二、线程核心方法
start():创建并启动线程,只能调用一次
run():线程真正执行逻辑,不启动线程
join():主线程阻塞等待子线程结束
is_alive():判断线程是否存活
三、线程等待 join() 关键原理
默认情况下,主线程不会等待子线程,主线程执行完毕会直接退出程序。join() 会阻塞主线程,直到子线程执行完毕。
t1.start() t1.join() # 主线程等待 t1 结束再往下走 print("主线程结束")四、守护线程 daemon
守护线程:主线程退出,守护线程强制退出,不阻塞程序结束。日志、心跳线程常用。
t = threading.Thread(target=task, daemon=True)五、线程执行无序性
线程由操作系统调度,执行顺序随机,无法人为控制,这也是线程安全问题的根源。