jle*_*and 1 python multithreading deadlock
我试图使用锁来写入和读取线程中的数据,但有一个我无法解决的死锁:s.
这就是事情.由于一个在我的问题中没用的原因,我必须启动一个自己启动其他线程的线程.所以我有:main - > 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 "::"
Run Code Online (Sandbox Code Playgroud)
我的问题是我最终陷入僵局.这是我得到的代码输出:!!!!:::!:
它阻止了它...所以似乎我的锁定版本从未被考虑过...
我试图将锁创建为全局变量,但它不会改变任何东西.
你能帮帮我吗?我真的没有看到问题
尝试调用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 "::"
Run Code Online (Sandbox Code Playgroud)
并回答:
所以似乎我的锁定版本从未被考虑过...
是的,它会忽略锁的释放,因为你不释放它:).