网络编程
位置:首页>> 网络编程>> Python编程>> 解决Python中定时任务线程无法自动退出的问题

解决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
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com