2011-12-14 2 views
1

잠금을 사용하여 스레드에서 데이터를 쓰고 읽으려고하지만 해결할 수없는 교착 상태가 있습니다.파이썬 스레드 및 잠금 : 교착 상태

여기 있습니다. 내 문제에서 유용하지 않은 이유로, 나는 다른 스레드를 시작하는 스레드를 시작해야합니다. 그래서 내가 가진 : 주요 -> 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 "::" 

내 문제는 내가이 교착 상태로 끝날 것입니다. 다음은 코드를 사용하여 얻은 결과입니다. ! !! ! !! : :: ! :

그리고 차단합니다. . . 내 잠금 장치가 절대로 고려되지 않은 것처럼 보입니다. . .

전역 변수로 잠금을 만들려고했지만 아무 것도 변경하지 않습니다.

도와 주시겠습니까?

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

을하고 대답 : 정말 lock.release 메소드를 호출하여 문제를

+0

'fill_gpsdata'와'gm.display_gpsdata'는 어떻게됩니까? –

+2

마지막'lock.release'에는'()'가 없습니다. 정상입니까? –

답변

6

시도가 표시되지

그래서 내 잠금 해제는 고려되지 않습니다처럼 보인다. . .

예, 잠금을 해제하지 않으므로 잠금 해제가 무시됩니다. :)

+0

오 마이. . . . 나는 누락 된 것을 알아 채지 않고이 코드를 몇 시간 동안 보냈다. 그것은 내 문제를 해결하는 것 같습니다. 나는 명백한 것을 보지 않고 더 복잡한 것을 찾았다. 여러분 덕분에! – jlengrand

+0

은 "메소드를 호출하는 것이 더 좋습니다"라고 투표했습니다. :) – lig