You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:40:39