使用Lock.acquire()和Lock.release()出现异常输出的问题排查
问题分析与解决
你的问题核心是每个线程都创建了独立的锁对象,导致锁无法起到跨线程的互斥作用。
问题根源
在procesa1函数内部定义lock = threading.Lock(),意味着每个线程启动后都会生成属于自己的锁实例。线程A获取自己的锁时,线程B也能同时获取自己的锁——两个锁完全独立、互不干扰,自然无法保证临界区(打印线程ID的循环)的独占访问,所以会出现输出穿插的情况。
修复后的代码
把锁定义在函数外部,让所有线程共享同一个锁实例:
from threading import Thread import threading import time # 定义全局共享锁,所有线程共用这一个 lock = threading.Lock() def procesa1(): lock.acquire() try: for i in range(3): print(threading.get_ident()) finally: lock.release() # 用finally确保锁一定会被释放,避免死锁 if __name__ == "__main__": hilos = [] for i in range(5): hilos.append(Thread(target=procesa1)) for thread in hilos: thread.start()
更优雅的写法
使用with语句可以自动管理锁的获取与释放,避免手动调用acquire/release可能引发的死锁问题:
def procesa1(): with lock: for i in range(3): print(threading.get_ident())
修改后,所有线程会竞争同一个锁,同一时间只有一个线程能进入临界区执行打印操作,输出的线程ID就会连续出现三次,不会再穿插。
内容的提问来源于stack exchange,提问作者user19551894
相关产品推荐
相关产品推荐

