Python 线程与锁:死锁问题

1 投票
1 回答
2389 浏览
提问于 2025-04-17 08:21

我正在尝试使用锁来在多个线程中读写数据,但遇到了一个我无法解决的死锁问题。:s

事情是这样的。出于某种原因,我必须启动一个线程,而这个线程又会启动其他线程。 所以我有这样的结构: 主线程 -> 发送GPS数据 -> 流会话

我在流会话中以无限循环的方式写入gpsData(每秒输出一个新的报告)。 我想在主线程中读取这些数据。为了避免数据损坏,我想使用一个阻塞锁。

这是我的代码:

def main():
    lock = threading.Lock()
    thread_gps = threading.Thread(None, send_gps_data, args=(gpsData, lock))  
    gps_thread_gps.start()

    # to allow interrupt
    while(gm.runn):
        try:
            time.sleep(0.5)
            print "!"
            lock.acquire():
            gm.display_gpsdata(gpsData)
            lock.release()
            print "!!"
        except KeyboardInterrupt:
            gm.runn = 0

def send_gps_data(gpsData, lock):
    global runn
    gps_thread = threading.Thread(None, stream_session, args=(gpsData, lock))    
    gps_thread.start()
    while(runn):
            time.sleep(1)
    gps_thread._Thread__stop()  
    sys.exit(0)

def stream_session(gpsData, session, lock):
    for report in session:
        if report.get("class") == "TPV":
            print ":"
            lock.acquire()
            fill_gpsdata(gpsData, session, report)
            lock.release
            print "::"

我的问题是,我最终遇到了死锁。以下是我运行代码时得到的输出: ! !! ! !! : :: ! :

然后程序就卡住了…… 看起来我的锁释放操作从来没有被执行……

我尝试将锁创建为全局变量,但这并没有改变任何情况。

你能帮我解决这个问题吗?我真的看不出问题出在哪里。

1 个回答

7

试着调用一下 lock.release 这个方法:

def stream_session(gpsData, session, lock):
    for report in session:
        if report.get("class") == "TPV":
            print ":"
            lock.acquire()
            fill_gpsdata(gpsData, session, report)
            lock.release()   # better to call the method
            print "::"

还有,针对这个问题:

看起来我的锁释放操作从来没有被考虑过……

没错,它会忽略锁的释放,因为你根本没有释放它 :)。

撰写回答