多个线程改同一份数据,没有锁就会写乱。最简单的做法是 threading.Lock:拿到锁的线程才能进临界区,用完再放掉。
python
import threading
lock = threading.Lock()
num = 100
def run(_name):
global num
lock.acquire()
try:
num -= 1
print("当前 num =", num)
finally:
lock.release()
threads = []
for i in range(20):
t = threading.Thread(target=run, args=(i,))
threads.append(t)
t.start()
for t in threads:
t.join()几点容易踩:
target必须是函数对象,写run不要写run()。- 函数里改模块级变量要
global。 acquire之后用try/finally放锁,避免中途异常把锁拿走不还。更短的写法是with lock:。- 锁会把这段代码变成实质上的串行。要并行的是「各干各的、最后再汇总」;共享计数、共享列表才需要锁。
join 等到线程结束。只 start 不 join,主线程可能先退出,现象会像「打印到一半就没了」。