python QT界面关闭线程池的线程跟随退出完美解决方案

方法一、线程池执行的循环代码为自己写的情况

定义一个全局变量,默认为T,当QT界面关闭后,将该变量值改为F。

线程执行的循环代码内增加一个判断方法,每次循环之前对全局变量进行判断,如果结果为T则进行循环、如果为F,则break退出循环,结束线程

from concurrent.futures import ThreadPoolExecutor 
import time
a = True # 设置全局变量
def fun(): # 线程池执行的函数
 while a: # 线程池中的循环代码,每次循环都检查一遍变量a的值
 time.sleep(0.1) # 线程需要执行的具体代码
 print('1')

tp = ThreadPoolExecutor(5) # 创建线程池
for i in range(10):
 tp.submit(fun) # 向线程池提交任务

time.sleep(1) 
a = False # 需要结束线程池任务时,执行该代码
tp.shutdown() # 关闭线程池

方法二、线程池中执行的循环为调用的模块内的方法

比如 paramiko 库中,sftp下载文件的方法。

这种情况可以利用回调函数进行判断。

回调函数检查控制变量,如果检测到需要停止执行时,执行sys.exit()结束退出线程

from concurrent.futures import ThreadPoolExecutor
import sys
import time

a = True
def call(): # 定义退出的函数
 if not a:
 print('线程结束退出')
 sys.exit() # 退出

def fun(callback=None): # 模拟sftp.get方法,循环执行,并且有回调函数
 while True:
 time.sleep(0.1)
 print('1')
 if callback != None:
 callback() # 每次循环调用回调函数,进行判断是否需要结束线程

tp = ThreadPoolExecutor(5)
for i in range(10):
 tp.submit(fun, call)

time.sleep(1)
a = False
tp.shutdown()
作者:柳道原文地址:https://www.cnblogs.com/mmld/p/15812996.html

%s 个评论

要回复文章请先登录注册