线程和主GUI同时访问log窗口造成的死锁问题

2020年6月19日 / 49次阅读 / Last Modified 2020年6月20日
tkinter多线程

主GUI上有按钮,事件背后有操作log窗口的代码,线程里的代码也有大量写log的代码。时不时出现死锁,一开始怀疑笔记本电脑太卡了,后来觉得不是。加上了一个mutex后,问题依然存在。

log窗口写入消息的时候,还有一把锁(mutex),虽然python的tkinter是线程安全的,但还是有一些状态控制代码,要通过锁来控制,否则也会乱套。

问题出现在点击GUI上的按钮,访问log窗口时,获取不到log窗口的mutex,因为此时这个mutex在线程手里,线程获得mutex后,还没有release,执行序列就被python切换到主GUI上,而主GUI上的执行是要一口气执行完的!(点击GUI上的按钮,按钮背后的代码要一口气执行完,否则GUI不会响应其它事件)

于是,就是死锁了。

这个问题在两个地方出现过:

一是我的tklog项目,有一次我在clean函数中也使用锁来控制,结果死锁。clean函数是主GUI上的代码,它的执行不会被打断,而获取不到锁就完了。

二是公司内gps项目,也是同样的情况。GUI事件和线程同时访问log窗口,死锁!

GUI程序加上线程互斥,这是坑多啊!!~~~

以后要注意:

GUI事件代码如果要访问log窗口,用线程,都用线程,就没事,就怕部分是线程,部分不是线程,就会死锁。或者,选择好线程启动的时机来规避可能出现的死锁!

-- EOF --

本文链接:https://www.pynote.net/archives/2063

留言区

《线程和主GUI同时访问log窗口造成的死锁问题》有5条留言

电子邮件地址不会被公开。 必填项已用*标注

  • 麦新杰

    在主GUI线程中等待mutex,是个很不好的设计! [回复]

  • 麦新杰

    在GUI事件处理中去等待mutex,整个GUI线程都block了,其它事件也就无法响应了!正常情况,向log窗口写内容这个函数调用,是不会block的,除非整个GUI被BLOCK了。 [回复]

  • 麦新杰

    GUI的事件响应,是一个一个进行的,都在一个线程内!线程中访问GUI的事件未完成,被调度中断了,GUI上的按钮事件启动后,等待线程释放资源。 [回复]

  • 麦新杰

    如果写log的调用内没有mutex,也不会出现这个问题,对吗?tkinter是线程安全的。 [回复]

  • 麦新杰

    使用Queue,也可以解决这类死锁。记住所有的代码,都要去写queue对象。GUI界面事件机制就绕开了,让GUI的定时器事件自己去写log。早期tkinter还不是线程安全的时候,人们就是用这种方法的。 [回复]


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top