2011-12-14 161 views
1

我想使用锁来写入和读取线程中的数据,但有一个死锁,我无法解决:s。Python线程和锁定:死锁

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

我写gpsData在stream_session,在一个无限循环(一个新的报表输出每秒)。 我想读取我的主要数据。 为了避免数据损坏,我想使用阻塞锁。

下面是代码:

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 "::" 

我的问题是,我结束了一个僵局。这是我用代码得到的输出: ! !! ! !! : :: ! :

在那里它阻止。 。 。 因此,似乎我的锁定释放从未被考虑。 。 。

我试图创建锁作为一个全局变量,但它不会改变任何东西。

你能帮我解决吗?我实在看不出问题

+0

什么是`fill_gpsdata`和`gm.display_gpsdata`起床? – 2011-12-14 10:58:41

+2

最后一个`lock.release`缺少`()`,是否正常? – 2011-12-14 10:58:57

回答

6

尝试调用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 "::" 

并回答到:

所以它看起来像我的锁释放是从来没有考虑。 。 。

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