Python线程和Lock:死锁

时间:2011-12-14 10:55:08

标签: python multithreading deadlock

我正在尝试使用锁来编写和读取线程中的数据但是有一个我无法解决的死锁:s。

这是事情。由于一个在我的问题中没用的原因,我必须启动一个自己启动其他线程的线程。 所以我有 :     主要          - > send_gps_data              - > stream_session

我在stream_session中写入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 个答案:

答案 0 :(得分: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 "::"

回答:

  

所以看起来我的锁定版本从未被考虑过。 。

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