잠금을 사용하여 스레드에서 데이터를 쓰고 읽으려고하지만 해결할 수없는 교착 상태가 있습니다.파이썬 스레드 및 잠금 : 교착 상태
여기 있습니다. 내 문제에서 유용하지 않은 이유로, 나는 다른 스레드를 시작하는 스레드를 시작해야합니다. 그래서 내가 가진 : 주요 -> 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
메소드를 호출하여 문제를
'fill_gpsdata'와'gm.display_gpsdata'는 어떻게됩니까? –
마지막'lock.release'에는'()'가 없습니다. 정상입니까? –