Skip to content

多个线程改同一份数据,没有锁就会写乱。最简单的做法是 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,主线程可能先退出,现象会像「打印到一半就没了」。

测试开发工程师 · 专注自动化与系统架构 | 邮箱: hansblog@atumsoul.win