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的地方也要添加创建类的代码。
这样就可以了。
以上这篇解决Python中定时任务线程无法自动退出的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
本文向大家介绍探寻python多线程ctrl+c退出问题解决方案,包括了探寻python多线程ctrl+c退出问题解决方案的使用技巧和注意事项,需要的朋友参考一下 场景: 经常会遇到下述问题:很多io busy的应用采取多线程的方式来解决,但这时候会发现python命令行不响应ctrl-c 了,而对应的java代码则没有问题: ctrl-c则会结束程序 而对应的python代码: python p
本文向大家介绍win2003远程退出后系统自动注销问题的解决方法,包括了win2003远程退出后系统自动注销问题的解决方法的使用技巧和注意事项,需要的朋友参考一下 解决windows2003远程退出后系统自动注销 如果通过上面的操作,还会出现远程桌面连接断开过段时间之后,运行的软件自动关闭的话,就再进行以下操作: 1、开始-->运行-->tscc.msc 连接-->RDP-Tcp右键属性-->会话
本文向大家介绍详解SpringBoot 多线程处理任务 无法@Autowired注入bean问题解决,包括了详解SpringBoot 多线程处理任务 无法@Autowired注入bean问题解决的使用技巧和注意事项,需要的朋友参考一下 在多线程处理问题时,无法通过@Autowired注入bean,报空指针异常, 在线程中为了线程安全,是防注入的,如果要用到这个类,只能从bean工厂里拿个实例。 解
本文向大家介绍spring-boot 多线程并发定时任务的解决方案,包括了spring-boot 多线程并发定时任务的解决方案的使用技巧和注意事项,需要的朋友参考一下 刚刚看了下Spring Boot实现定时任务的文章,感觉还不错。Spring Boot 使用Spring自带的Schedule来实现定时任务变得非常简单和方便。在这里个大家分享下。 开启缓存注解 编写定时任务 任务完成 启动项目,查
本文向大家介绍python线程中的同步问题及解决方法,包括了python线程中的同步问题及解决方法的使用技巧和注意事项,需要的朋友参考一下 多线程开发可能遇到的问题 假设两个线程t1和t2都要对num=0进行增1运算,t1和t2都各对num修改1000000次,num的最终的结果应该为2000000。但是由于是多线程访问,有可能出现下面情况: 运行结果可能不一样,但是结果往往不是2000000。问
本文向大家介绍python子线程退出及线程退出控制的代码,包括了python子线程退出及线程退出控制的代码的使用技巧和注意事项,需要的朋友参考一下 下面通过代码给大家介绍python子线程退出问题,具体内容如下所示: 跑起来是没有问题的,但是使用ctrl + c中断的时候出问题了,主线程退出了,但子线程仍然运行。 于是在主线程增加了信号处理的代码,收到sigint时改变子线程循环条件 这样ctrl