最近被GUI多线程代码的死锁问题搞的有点头大,本文总结一下自己的所思所得,并不代表完全正确,因为毕竟没有去阅读tk的源代码。

mainloop,故名思议,它就应该是python程序的mainThread。这个GUI的mainloop,靠事件响应驱动。比如有一个button(A),点A,就是给这个mainloop传递了一个事件,这个事件最后会传递到A绑定的commnad函数中去执行。

不要阻塞tkinter的mainloop,就是不要在事件响应的函数中阻塞住,否则GUI会卡死。常见的现象是,A绑定的函数执行需要那么一点点时间,点击下去后,GUI就会卡住那么一点点时间。所以,大多数编程教材都建议使用多线程来规避GUI的卡死,即点击A后启动一个线程,A绑定的函数立即返回,释放GUI(表示GUI有可能接收别的事件的响应了),具体工作由线程完成。

由线程来完成工作,并规避GUI的卡死,是个很好的最佳实践,不过,我遇到的问题是,线程被GUI卡死了!

计算模型大概是这样的:多个线程通过操作一个Text控件就是往里写log;写log的执行流程代码中,有mutex,用来多线程间控制Text的状态;GUI的事件响应中,也有mutex.acquire;只要GUI出发这个事件,整个程序就死锁了。

为什么会这样呢?我想来想去,觉得出问题的地方,就是线程被GUI卡死了。为什么线程会被卡死呢?因为线程在mutex.acquire中在向GUI发事件(操作Text),而此时GUI在等待mutex,于是死锁。

GUI在一个事件没有处理完的情况下,是无法处理别的事件的。比如我们在A的绑定函数中sleep,整个GUI上其它地方都点不了(OS会记录这些事件,在GUI被释放后再把这些事件灌给它)。线程中对Text的操作无法返回,很可能就是因为GUI已经被卡死了。

奇怪的是,如果A绑定代码中也操作Text,不会卡死,而只是在GUI被释放后,一口气把所有的log全显示出来,log显示的过程只是感觉不流畅而已。区别在于mainloop中触发事件和非mainloop中触发(我个人的理解哈),也许存在内部事件和外部事件这样的区别,外部事件会被阻塞,即线程操作Text的代码被阻塞,而mainloop中操作Text的代码,只是更新延后。

总之,在GUI中如果有mutex.acquire这样的代码,是非常危险的,一不留神就死锁。不要阻塞mainloop的事件响应,用线程是OK的,用户友好。多线程之间有mutex没问题,只要GUI的mainloop没有被卡死。

-- EOF --

python退出mainloop_不要阻塞tkinter的mainloop相关推荐

  1. python中文编辑_python用Tkinter做自己的中文代码编辑器

    前面我们给了Tkinter接管Python输入和输出的介绍,我们不难可以想到,能用Tkinter来开发自己的Python代码编辑器.例如可以使用Text控件作代码编辑器. 实际上我在HP_tk2中已经 ...

  2. python界面设计-python图形化界面设计tkinter

    匿名用户 1级 2017-12-13 回答 python提供了多个图形开发界面的库,几个常用Python GUI库如下: Tkinter: Tkinter模块("Tk 接口")是P ...

  3. python中的gui界面编程_python应用系列教程——python的GUI界面编程Tkinter全解

    全栈工程师开发手册 (作者:栾鹏) python的GUI界面编程,常用的几个python库包含如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包 ...

  4. Python使用鼠标滚轮调整tkinter应用程序窗口大小

    图书推荐: <Python程序设计基础与应用>(ISBN:9787111606178),董付国,机械工业出版社 图书详情: 用书教师可以联系董老师获取教学大纲.课件.源码.教案.考试系统等 ...

  5. python应用系列教程——python的GUI界面编程Tkinter全解

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python的GUI界面编程,常用的几个python库包含如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 ...

  6. 演示4:python的币值转换-含tkinter

    演示4:python的币值转换-含tkinter 1 说明 2 知识点 2.1 汇率与币种 2.2 元组 2.3 if 的用法 2.3.1 if 的单独用法 2.3.2 if else 的组合用法 2 ...

  7. Python|线程和进程|阻塞|非阻塞|同步|异步|生成器和协程|资源竞争|进程间通信|aiohttp库|daemon属性值详解|语言基础50课:学习(11)

    文章目录 系列目录 原项目地址 第34课:Python中的并发编程-1 线程和进程 多线程编程 使用 Thread 类创建线程对象 继承 Thread 类自定义线程 使用线程池 守护线程 资源竞争 G ...

  8. Python自动生成代码 - 通过tkinter图形化操作生成代码框架

    Python自动生成代码 - 通过tkinter图形化操作生成代码框架 背景 脚本代码 Demo_CodeGenerator.py display.py FileHandler.py: 脚本运行结果: ...

  9. Python 内置界面开发框架 Tkinter入门篇 丁

    如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/X5cqennLrq7i1pzBAAqQ2w 本文大概 2562 个字,阅读需花 15 分钟 ...

最新文章

  1. JFileChooser文件过滤的实现
  2. Ajax异步调用Web服务的例子
  3. Bengio实验室推出开源AI药物研发平台,唐建领队、清北上交学生参与开发
  4. Oracle 序列和触发器
  5. Scala 语言之模式匹配(6)
  6. iOS之深入解析UmbrellaFramework的封装与应用
  7. mac android mtp,果粉也用安卓!MacBook连接安卓机最好的工具
  8. asp.net下载文件几种方式
  9. PAGE:像Visual Studio一样设计Python GUI窗体
  10. CSS学习总结(2)——选择器
  11. MySQL存储引擎InnoDB、MyISAM 、其它存储引擎介绍
  12. 【算法】二叉树遍历算法总结:前序中序后序遍历
  13. 微信dat文件用什么软件打开方式_dat文件用什么打开 微信电脑图片dat转为jpg
  14. Windows 4K低延时H265/H264硬编码直播
  15. 神经元模型 Hodgkin Huxley model
  16. DLL load failed while importing rdBase
  17. JAVA中数字转大写字母_java实现数字转大写
  18. SpringBoot Elasticsearch工具类封装
  19. 【Python】2019年武汉市天气数据分析与可视化
  20. 用tailwindcss适配暗黑模式竟如此简单

热门文章

  1. 内存对齐还是需要重视的——XMMATRIX 为例
  2. Nodejs创建简单的Bot
  3. Thinking In Java 读书笔记
  4. ubuntu 安装deb程序文件失败的解决方法
  5. 利用logminer恢复delete误删除操作的数据
  6. Data Member 的绑定
  7. 典型案例:TL的困局,自己忙不过来,团队没有结果
  8. Android蓝牙设备名显示修改
  9. 队列、函数-多线程 线程队列的实现-by小雨
  10. “一个人自修没感觉!”