解决Python中定时任务线程无法自动退出的问题
作者:hhgood 发布时间:2022-09-05 22:52:52
标签:Python,线程,退出
python的线程有一个类叫Timer可以,用来创建定时任务,但是它的问题是只能运行一次,如果要重复执行,则只能在任务中再调用一次timer,但这样就存在新的问题了,就是在主进程退出后,不能正常退出子线程。
from threading import Timer
def scheduletaskwrap():
pritn "in task"
Timer(10, scheduletaskwrap).start()
Timer(10, scheduletaskwrap).start()
象上面这样,就可以每10秒调用一次线程,但是当你退出整个程序后,子线程
scheduletaskwrap
还在继续执行,要通知它退出怎么办?
python的线程模块提供了很多办法,什么event,wait,lock等,这些都比较麻烦不适合这种定时任务的简单方法。
最简单的就是设置一个全局变量,然后在线程中判断它是否改变。
from threading import Timer
gflag=1
def scheduletaskwrap():
global gflag
pritn "in task"
if gflag==1:
Timer(10, scheduletaskwrap).start()
Timer(10, scheduletaskwrap).start()
想象是美好的,你实际运行就会发现,这样行不通,因为主进程退出后,那个全局变量,在子线程中还是1,没有改变,因为python不存在什么退出通知之类的机制。
那没有其他办法了吗?经过思考,既然进程没有退出通知,但是类可以啊,类一般都有析构函数,可以用它来实现全局变量的改变,于是添加了一个类,在析构函数中把全局变量改成0,这样就可以了。
class timerexec():
threadhandle=0
def __init__(self,thandle):
threadhandle=thandle
def __del__(self):
global gflag
gflag=0
print u"线程结束",gflag
threadhandle.cancel
refreshthread=Timer(10, scheduletaskwrap).start()
a=timerexec(refreshthread)
主进程中调用timer的地方也要添加创建类的代码。
这样就可以了。
来源:https://blog.csdn.net/hhgood/article/details/80013871
0
投稿
猜你喜欢
- 我不知道没有他们我该如何生活我编写Python已有5年以上了,我的工具集通常变得越来越小,而不是越来越大。 许多工具不是必需的或无用的,而其
- 实现一个优先级队列,每次pop的元素要是优先级高的元素,由于heapq.heapify(list)默认构建一个小顶堆,因此要将priorit
- Python基本输入和输出1.input输入函数input函数:获取用户输入,保存成一个字符串。>>> name = in
- 通过Python脚本批量生成插入数据的SQL语句原始SQL语句:INSERT INTO system_user (id, login_nam
- php获取域名的google收录示例function get_index($domain){ $url="http://www.g
- 更多的信息,可以参考python内部的json文档: python>>> help(json) 或者官方文档: http:
- 目录一、== 是比较两个对象的内容是否相等二、is 比较的是两个实例对象是不是完全相同三、使用is注意python对于小整数使用对象池存储问
- 池化层定义在tensorflow/python/layers/pooling.py.有最大值池化和均值池化。1、tf.layers.max_
- 最近项目中用到celery很多,Django快速接入celery,这里给份教程。准备pip安装celery、flower、eventlet快
- 一、概念触发器是一种特殊类型的存储过程,不由用户直接调用。创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行。触发器可
- Beautiful Soup使用时,一般可以通过指定对应的name和attrs去搜索,特定的名字和属性,以找到所需要的部分的html代码。但
- 题目描述利用opencv或其他工具编写程序实现缺陷检测。实现过程# -*- coding: utf-8 -*-'''
- 用pycharm开发时,在导入自己写的python文件时出现模块名爆红的情况,而且后面每次调用文件里的函数都没有没有提示,必须自己手动输入,
- 简介在SQL SERVER中,数据库在硬盘上的存储方式和普通文件在Windows中的存储方式没有什么不同,仅仅是几个文件而已.SQL SER
- 最佳方式:根据map的长度,新建一个数组,遍历map逐个压入方法1(效率很高):func getKeys1(m map[int]int) [
- 文本如图:Python:import sysresult=[]with open('accounts.txt','r
- 本文实例讲述了js实现固定显示区域内自动缩放图片的方法。分享给大家供大家参考。具体实现方法如下:<!DOCTYPE html PUBL
- 一、概论超大型系统的特点为:1、处理的用户数一般都超过百万,有的还超过千万,数据库的数据量一般超过1TB;2、系统必须提供实时响应功能,系统
- 用tornado web服务的基本流程1.实现处理请求的Handler,该类继承自tornado.web.RequestHandler,实现
- 1.嵌入 IFrame(/assets/img/anchor.svg)]()](https://gradio.app/sharing-you