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()

到此这篇关于python QT界面关闭,线程池的线程跟随退出解决思路方法的文章就介绍到这了,更多相关python QT界面关闭内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python+PyQt5实现数据库表格动态增删改

    目录 题目描述 解题思路/算法分析/问题及解决 实验代码 运行结果 题目描述 本次实验为连接数据库的实验,并对数据库进行一些简单的操作,要实现的基本功能如下所示,要能连接并展现数据库里的数据,能够实现插入功能. 拓展; 实现按学号查找学生信息功能 实现清空数据功能 实现保存数据功能 实现右键菜单功能 解题思路/算法分析/问题及解决 本次实验可主要分为两个部分,即数据库连接操作部分和数据可视化操作界面部分. 数据库连接部分采用python的pymysql库对数据库进行连接操作. 数据可视化部分采用

  • 使用python+Pyqt5实现串口调试助手

    python可以利用serial模块来和串口设备进行485或者232通讯. 当然,网上这类串口调试助手的小程序有很多,不过这些程序要么是要收费,只能试用30天,要么是不好用. 况且,别人写的程序,你只能使用,无法取出其中的数据来进行处理,所以,如果可以自己写一个程序,既方便使用,又可以随时随地使用其中的数据. 软件:python3.10pycharm2021硬件:window10电脑串口485设备(国产流量计)串口转usb线(电脑不带串口,只能转接) 准备好了后,就可以开始写程序了. 串口通讯程

  • 解决Python中定时任务线程无法自动退出的问题

    python的线程有一个类叫Timer可以,用来创建定时任务,但是它的问题是只能运行一次,如果要重复执行,则只能在任务中再调用一次timer,但这样就存在新的问题了,就是在主进程退出后,不能正常退出子线程. from threading import Timer def scheduletaskwrap(): pritn "in task" Timer(10, scheduletaskwrap).start() Timer(10, scheduletaskwrap).start() 象

  • python子线程退出及线程退出控制的代码

    下面通过代码给大家介绍python子线程退出问题,具体内容如下所示: def thread_func(): while True: #do something #do something #do something t=threading.Thread(target = thread_func) t.start() # main thread do something # main thread do something # main thread do something 跑起来是没有问题的,

  • python多线程调用exit无法退出的解决方法

    python启用多线程后,调用exit出现无法退出的情况,原因是exit会抛出Systemexit的异常,如果在exit外围调用了try,就会出现ctrl+c两次才能退出的情况 解决方法: thread.setDaemon(True) thread.start() 线程启动前设置setDaemon(True) 以上这篇python多线程调用exit无法退出的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • python 线程的暂停, 恢复, 退出详解及实例

    python 线程 暂停, 恢复, 退出 我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦start后, 线程就属于失控状态. 不过, 我们可以自己实现这些. 一般的方法就是循环地判断一个标志位, 一旦标志位到达到预定的值, 就退出循环. 这样就能做到退出线程了. 但暂停和恢复线程就有点难了, 我一直也不清除有什么好的方法, 直到我看到thread

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

    目录 方法一.线程池执行的循环代码为自己写的情况 方法二.线程池中执行的循环为调用的模块内的方法 方法一.线程池执行的循环代码为自己写的情况 定义一个全局变量,默认为T,当QT界面关闭后,将该变量值改为F. 线程执行的循环代码内增加一个判断方法,每次循环之前对全局变量进行判断,如果结果为T则进行循环.如果为F,则break退出循环,结束线程 from concurrent.futures import ThreadPoolExecutor import time a = True # 设置全局变

  • python自定义线程池控制线程数量的示例

    1.自定义线程池 import threading import Queue import time queue = Queue.Queue() def put_data_in_queue(): for i in xrange(10): queue.put(i) class MyThread(threading.Thread): def run(self): while not queue.empty(): sleep_times = queue.get() time.sleep(sleep_t

  • Python实现线程池之线程安全队列

    目录 一.线程池组成 二.线程安全队列的实现 三.测试逻辑 3.1.测试阻塞逻辑 3.2.测试读写加锁逻辑 本文实例为大家分享了Python实现线程池之线程安全队列的具体代码,供大家参考,具体内容如下 一.线程池组成 一个完整的线程池由下面几部分组成,线程安全队列.任务对象.线程处理对象.线程池对象.其中一个线程安全的队列是实现线程池和任务队列的基础,本节我们通过threading包中的互斥量threading.Lock()和条件变量threading.Condition()来实现一个简单的.读

  • Java concurrency线程池之线程池原理(二)_动力节点Java学院整理

    线程池示例 在分析线程池之前,先看一个简单的线程池示例. import java.util.concurrent.Executors; import java.util.concurrent.ExecutorService; public class ThreadPoolDemo1 { public static void main(String[] args) { // 创建一个可重用固定线程数的线程池 ExecutorService pool = Executors.newFixedThre

  • Java concurrency线程池之线程池原理(四)_动力节点Java学院整理

    拒绝策略介绍 线程池的拒绝策略,是指当任务添加到线程池中被拒绝,而采取的处理措施. 当任务添加到线程池中之所以被拒绝,可能是由于:第一,线程池异常关闭.第二,任务数量超过线程池的最大限制. 线程池共包括4种拒绝策略,它们分别是:AbortPolicy, CallerRunsPolicy, DiscardOldestPolicy和DiscardPolicy. AbortPolicy         -- 当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException

  • Java 自定义线程池和线程总数控制操作

    1 概述 池化是常见的思想,线程池是非常典型的池化的实现,<Java并发编程实战>也大篇幅去讲解了Java中的线程池.本文实现一个简单的线程池. 2 核心类 [1]接口定义 public interface IThreadPool<Job extends Runnable> { /** * 关闭线程池 */ public void shutAlldown(); /** * 执行任务 * * @param job 任务 */ public void execute(Job job);

  • @Async异步线程池以及线程的命名方式

    本文记录@Async的基本使用以及通过实现ThreadFactory来实现对线程的命名. @Async的基本使用 近日有一个道友提出到一个问题,大意如下: 业务场景需要进行批量更新,已有数据id主键.更新的状态.单条更新性能太慢,所以使用in进行批量更新.但是会导致锁表使得其他业务无法访问该表,in的量级太低又导致性能太慢. 龙道友提出了一个解决方案,把要处理的数据分成几个list之后使用多线程进行数据更新.提到多线程可直接使用@Async注解来进行异步操作. 好的,接下来上面的问题我们不予解答

  • 详解Java线程池如何实现优雅退出

    目录 shutdown()方法 shutdownNow()方法 awaitTermination(long, TimeUnit)方法 在[高并发专题]中,我们从源码角度深度分析了线程池中那些重要的接口和抽象类.深度解析了线程池是如何创建的,ThreadPoolExecutor类有哪些属性和内部类,以及它们对线程池的重要作用.深度分析了线程池的整体核心流程,以及如何拆解Worker线程的执行代码,深度解析Worker线程的执行流程. 本文,我们就来从源码角度深度解析线程池是如何优雅的退出程序的.首

  • Springboot 配置线程池创建线程及配置 @Async 异步操作线程池详解

    目录 前言 一.创建一个Springboot Web项目 二.新建ThreadPoolConfig 三.新建controller测试 四.演示结果 前言 众所周知,创建显示线程和直接使用未配置的线程池创建线程,都会被阿里的大佬给diss,所以我们要规范的创建线程. 至于 @Async 异步任务的用处是不想等待方法执行完就返回结果,提高软件前台响应速度,一个程序中会用到很多异步方法,所以需要使用线程池管理,防止影响性能. 一.创建一个Springboot Web项目 需要一个Springboot项

  • Java concurrency线程池之线程池原理(一)_动力节点Java学院整理

    ThreadPoolExecutor简介 ThreadPoolExecutor是线程池类.对于线程池,可以通俗的将它理解为"存放一定数量线程的一个线程集合.线程池允许若个线程同时允许,允许同时运行的线程数量就是线程池的容量:当添加的到线程池中的线程超过它的容量时,会有一部分线程阻塞等待.线程池会通过相应的调度策略和拒绝策略,对添加到线程池中的线程进行管理." ThreadPoolExecutor数据结构 ThreadPoolExecutor的数据结构如下图所示: 各个数据在Thread

随机推荐