python pyqt5在使用多线程时自动退出是怎么回事?

Python011

python pyqt5在使用多线程时自动退出是怎么回事?,第1张

线程只执行一次……让我来猜一猜。

你可能会认为创建一个线程去执行某个动作就完事了?

一段代码不管是在主线程里还是在新建的线程里,它都是按代码本身的规则那么执行的,该循环就循环,该结束就结束。

所以,我们建立一个线程去执行某个动作,主要就是让这个动作的执行不影响主程的执行,不要因为它导致主程序的某环节等待这个动作的结果。

举例来说,一个定时3秒去读一下某个文件,总不能做个循环,读一下文件,然后sleep3秒吧,那除了这个,什么也干不了,基本都是在【等待3秒】这里耗着了。解决办法就是做个线程去完成【读某个文件】,然后这个事完了之后、前再建一个同样的线程让它三秒后执行。

看下图:

这个sort_loop就是这样干的:

【红框2】就是主要的工作内容(对self.data进行收缩)

如果简简单单的就这,那它就执行一次就完事了,哪怕你把sort_loop放到新线程里,也是一样。

要在sort_loop里再新建一个线程,新线程还是执行sort_loop,于是就是这样的:

A把桌子擦了擦,把抹布塞给了B;

B把桌子擦了擦,把抹布塞给了C

C把桌子擦了擦,把抹布塞给了D...

这才构成一个线程循环。

这种情况很正常,Python自身的线程并不安全且不与PyQt兼容,你既然用PyQt了,为什么不尝试用Qt自身的线程类QThread呢?那么基于Qt自身的特点,主线程关闭时,子线程就可以安全地退出了,而不会出现你现在这种情况了。

并发:逻辑上具备同时处理多个任务的能力。

并行:物理上在同一时刻执行多个并发任务。

举例:开个QQ,开了一个进程,开了微信,开了一个进程。在QQ这个进程里面,传输文字开一个线程、传输语音开了一个线程、弹出对话框又开了一个线程。

总结:开一个软件,相当于开了一个进程。在这个软件运行的过程里,多个工作同时运转,完成了QQ的运行,那么这个多个工作分别有多个线程。

线程和进程之间的区别:

进程在python中的使用,对模块threading进行操作,调用的这个三方库。可以通过 help(threading) 了解其中的方法、变量使用情况。也可以使用 dir(threading) 查看目录结构。

current_thread_num = threading.active_count() # 返回正在运行的线程数量

run_thread_len = len(threading.enumerate()) # 返回正在运行的线程数量

run_thread_list = threading.enumerate() # 返回当前运行线程的列表

t1=threading.Thread(target=dance) #创建两个子线程,参数传递为函数名

t1.setDaemon(True) # 设置守护进程,守护进程:主线程结束时自动退出子线程。

t1.start() # 启动子线程

t1.join() # 等待进程结束 exit()`# 主线程退出,t1子线程设置了守护进程,会自动退出。其他子线程会继续执行。