python线程卡死问题解决_再谈python3的tkinter开发UI界面,多线程解决界面卡死、无响应...

a552ee41-6c40-4860-bd52-3bd1f02b8763

前面的文章已经介绍过两种小技巧,让我们回顾一下,就是:

1、在window.mainloop()前一定要加window.after(250) #250ms 用于延迟进行窗体本身的死循环,250毫秒时间可以根据实际情况调整,对于I/O执行时间较长的,可以加到1000毫秒

2、在我们按下button,绑定的command要执行的函数体内部,加window.update_idletasks()进行窗体刷新

3、如果以上方法效果都不明显,那么就是我们今天重点要讨论的多线程出场了。讲多线程解决界面卡死的文章不下少数,可是很少有一篇能真正讲明白的,本文试着谈谈自己在实践中的心得体会。

多线程听起来挺高大上的,幸好python把它做成了模块,而且还原生自带,让多线程用起来就跟函数调用一样方便。python中有Threading和Thread模块,Threading用于增强多线程模块 thread的,所以多线程不用想用Threading。import threading吧。

另外我们写的程序任务,可以分为CPU密集型和I/O密集型,CPU密集型是指需要大量消耗CPU资源进行密集计算的任务,比如浮点数计算,科学数据计算等,由于python有全局锁 (GIL)的存在,python多线程并不适合跑这种任务,因为全局锁会限制所有的多线程其实是跑在一个主线程之下的,而多线程的线程切换是需要消耗CPU资源的,所以多线程跑CPU密集型不敢说是灾难,至少也快不起来。

下面谈谈多线程在I/O密集型任务中的表现吧,先解释下I/O密集型是啥情况,比如我们读写文件,从网上下载资源等都是I/O操作,I/O操作占用CPU资源往往不多,但是却挺费时间的,比如下载10个文件,你要是单线程一个一个下,一个在下,其他都得干等着,那时间就挺长的,碰到中间某一个下载比较慢,那就是浪费很多时间;多线程就是可以解决这个问题。一次3-4个文件同时下,一个没速度,闲置的带宽会被其他三个所瓜分,保证网络不会闲置,文件下载不会停止。

言归正传,我们可以用以下代码启动一个线程:

my_thread = threading.Thread(target=function, args=(i,))

my_thread.start()

如果要启动多个线程,我们就在前面加个循环,比如 for i in range(5):

。其中function是函数名,args是函数的参数项,i是要传入function的值,相当于形参。注意即使只有i一个参数,格式也要这么写args=(i,)。

很显然,我们在tkinter开发界面的时候,UI界面就相当于一个主线程,它所绑定的command后面的函数就是我们要打包扔进线程的函数function。注意function内部要是还有函数调用,也得把function扔进线程,不然单单把内部函数扔进线程,还是要卡的哦,这一点在实践中是深有体会的,大家别踩这个坑。另外,我们在启动线程之后,不要在my_thread.start()后面加my_thread.join(),加了就会阻塞线程,界面又变卡了。是不是坑很多啊,今天就讲这么多了,觉得好,欢迎转发收藏。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值