【python】【GUI编程】启动一个后台线程任务
一、多线程介绍
多线程类似于同时执行多个不同程序(实际上是串行,因为CPU线程上下文切换很快,只是看上去感觉同时执行)。每个线程任务都有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的状态。指令指针寄存器和堆栈指针寄存器是线程上下文中两个最重要的寄存器,这些寄存器地址都用于标志拥有线程的进程地址空间中的内存,线程总是在进程得到上下文中运行的,在进程中只要线程获取到CPU控制权就会被执行,在线程中来回切换线程,提高CPU利用率,这就是多线程的好处,但是稍微利用不好就会造成性能开销压力。因此线程具有以下特点:
- 线程可以被抢占(中断)。
- 在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) -- 这就是线程的退让。
多线程也有缺点,比如频繁的上下文切换、线程安全等问题,有的认为多线程是因为上下文切换带来的性能开销才会出现多线程怎么这里又会出现这个问题呢?我们把线程也分为两类:一类是内核线程:由操作系统创建和撤销;另一种是用户线程,也就是我们使用在应用程序中线程,由我们自己实现的线程。两种类型的线程都需要上下文切换,只是内核线程的开销远大于用户线程。
二、多线程优点
- 使用线程可以把占据长时间的程序中的任务放到后台去处理。
- 用户界面可以更加吸引人,比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。
- 程序的运行速度可能加快。
- 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等
三、python中的多线程
Python3 线程中常用的两个模块为:
- _thread
- threading(推荐使用)
thread 模块已被废弃。用户可以使用 threading 模块代替。所以,在 Python3 中不能再使用"thread" 模块。为了兼容性,Python3 将 thread 重命名为 "_thread"。
代码使用:
# 导入线程模块
from threading import Thread
# 建立一个新线程
def textTask(self):
# 建立线程,传入线程任务self.autoScrollText即可
t = Thread(target=self.autoScrollText)
# 开启线程运行
t.start()
# 定义一个线程执行的任务
def autoScrollText(self):
# 一直循环执行这个任务
while True:
# 建议在执行的任务中手动加try捕获异常,防止因异常而导致任务终止
try:
# 具体要执行的业务任务
self.totalSize['text'] = len(self.data)
indexsize = 30
if indexsize >= len(self.data):
indexsize = len(self.data)
if len(self.data) > 0:
for num in range((len(self.data) // indexsize) + 1):
if num > (len(self.data) // indexsize) + 1:
break
self.source.delete(1.0, 'end')
lists = []
if indexsize >= len(self.data):
indexsize = len(self.data)
for index in range(indexsize):
get = num * indexsize + index
if get >= len(self.data) - 1:
lists.append(self.data[len(self.data) - 1])
break
lists.append(self.data[get])
self.source.insert(tkinter.END, ("\n").join(lists))
self.totalSize['text'] = len(self.data)
# 休眠线程,时间为参数
sleep(2)
else:
self.source.delete(1.0, 'end')
# 休眠线程,时间为参数
sleep(2)
except IndexError:
self.source.delete(1.0, 'end')
# 休眠线程,时间为参数
sleep(2)
四、总结
python多线程基本使用步骤:
1.导入线程模块theading
2.创建一个线程任务(主要是业务执行的任务)
3.启动一个线程后台执行线程任务,调用start()方法
- 点赞
- 收藏
- 关注作者
评论(0)