Python 并发必备:`threading` 必须掌握的核心 API 与示例
如果你只想记住最少却最常用的
threading
知识,看这篇就够了!文末附一键运行脚本。
1. 创建并启动线程:Thread(target=..., args=...)
import threading
def worker(num):
print(f"Worker {num} 正在执行")
threads = []
for i in range(3):
t = threading.Thread(target=worker, args=(i,))
threads.append(t)
t.start()
for t in threads:
t.join() # 等待所有线程结束
print("全部线程已完成")
2. 守护线程:daemon=True
守护线程不会阻止主程序退出,适合做心跳、日志等后台任务。
import threading, time
def background():
while True:
print("后台心跳...")
time.sleep(1)
t = threading.Thread(target=background, daemon=True)
t.start()
print("主线程结束即退出,不会等守护线程")
3. 等待线程结束:join()
import threading, time
def task():
time.sleep(2)
print("子线程完成")
t = threading.Thread(target=task)
t.start()
t.join() # 阻塞直到子线程结束
print("主线程继续")
4. 线程安全锁:Lock
+ with
import threading
counter = 0
lock = threading.Lock()
def safe_incr():
global counter
for _ in range(100000):
with lock: # 等价于 acquire()/release()
counter += 1
threads = [threading.Thread(target=safe_incr) for _ in range(2)]
for t in threads: t.start()
for t in threads: t.join()
print("最终 counter =", counter) # 必为 200000
5. 线程间通信:Event
import threading, time
event = threading.Event()
def waiter():
print("等待事件触发...")
event.wait() # 阻塞
print("收到事件,继续执行")
t = threading.Thread(target=waiter)
t.start()
time.sleep(2)
event.set() # 触发
t.join()
6. 获取当前线程名:threading.current_thread().name
import threading
def whoami():
print("当前线程:", threading.current_thread().name)
threading.Thread(target=whoami, name="worker-1").start()
7. 一键运行脚本(保存为 threading_must_know.py
)
"""
Python threading 必会示例合集
运行:python threading_must_know.py
"""
import threading, time
# 1. 创建线程
def worker(n):
print(f"[{threading.current_thread().name}] 任务 {n}")
ts = [threading.Thread(target=worker, args=(i,)) for i in range(3)]
for t in ts: t.start()
for t in ts: t.join()
# 2. 守护线程
def daemon_task():
while True:
time.sleep(1)
threading.Thread(target=daemon_task, daemon=True).start()
# 3. 锁示例
count = 0
lock = threading.Lock()
def safe_add():
global count
for _ in range(10000):
with lock:
count += 1
threads = [threading.Thread(target=safe_add) for _ in range(2)]
for t in threads: t.start()
for t in threads: t.join()
assert count == 20000
print("锁验证通过 ✅")
# 4. Event 示例
evt = threading.Event()
def waiter():
evt.wait()
print("Event 触发,waiter 继续")
threading.Thread(target=waiter).start()
time.sleep(1)
evt.set()
总结卡片(背诵用)
API | 记忆口诀 | 示例 |
---|---|---|
创建线程 | Thread(target, args) | t = Thread(target=f, args=(1,)); t.start() |
等线程结束 | t.join() | t.join() |
守护线程 | daemon=True | Thread(..., daemon=True) |
线程安全 | with lock | with threading.Lock(): ... |
线程通信 | Event().set / wait | e.set(); e.wait() |
当前线程名 | current_thread().name | threading.current_thread().name |
把这些示例跑一遍,你就掌握了 threading
90% 的日常用法!