Python threading 模块
Thread objects, daemon threads, locks, events and timers.
Key PointsDaemon threads die with the main thread — good for background heartbeats, wrong for anything that must finish.
Thread Objects
Either pass a target or subclass and override run().
Python
import threading
import time
def job(name, n):
for i in range(n):
print(name, i)
time.sleep(0.1)
t1 = threading.Thread(target=job, args=("A", 2))
t2 = threading.Thread(target=job, args=("B", 2))
t1.start(); t2.start()
t1.join(); t2.join()
print("done")Output
A 0
B 0
A 1
B 1
doneDaemon and Timer
A daemon thread does not block process exit. Timer runs once after a delay — handy as a timeout fallback.
Python
import threading
import time
def heartbeat():
while True:
print("ping")
time.sleep(1)
threading.Thread(target=heartbeat, daemon=True).start()
t = threading.Timer(1.5, lambda: print("timeout fired"))
t.start()
time.sleep(2)
print("main exits, daemon dies")Output
ping
timeout fired
ping
main exits, daemon diesEvent for Signalling
Event is the lightest inter-thread signal: one thread calls set(), others wake from wait().
Python
import threading
ready = threading.Event()
def worker():
print("waiting")
ready.wait() # 阻塞直到 set()
print("go")
threading.Thread(target=worker).start()
ready.set()Output
waiting
goThere is no thread kill API. Stop a thread cooperatively with an Event flag.
Thread 对象
两种写法:传 target 函数,或继承 Thread 重写 run()。前者更常见,后者适合需要保存状态的场景。
Python
import threading
import time
def job(name, n):
for i in range(n):
print(name, i)
time.sleep(0.1)
t1 = threading.Thread(target=job, args=("A", 2))
t2 = threading.Thread(target=job, args=("B", 2))
t1.start(); t2.start()
t1.join(); t2.join()
print("done")Output
A 0
B 0
A 1
B 1
done守护线程与定时器
daemon=True 的线程不会阻止进程退出。threading.Timer 是「延迟 N 秒后跑一次」的线程,常用于超时兜底。
Python
import threading
import time
def heartbeat():
while True:
print("ping")
time.sleep(1)
threading.Thread(target=heartbeat, daemon=True).start()
t = threading.Timer(1.5, lambda: print("timeout fired"))
t.start()
time.sleep(2)
print("main exits, daemon dies")Output
ping
timeout fired
ping
main exits, daemon dies用 Event 做信号
Event 是最轻量的线程间信号:一个线程 set(),其他线程 wait() 被唤醒。比轮询标志位省 CPU。
Python
import threading
ready = threading.Event()
def worker():
print("waiting")
ready.wait() # 阻塞直到 set()
print("go")
threading.Thread(target=worker).start()
ready.set()Output
waiting
goPython 线程没有强制终止 API。要「停掉」一个线程,靠
Event 之类的协作式标志,让它自己退出循环。