PHP前端开发

通过Python3实现任务的定时循环执行

百变鹏仔 1个月前 (01-23) #Python

在我们的实际开发中,经常有这样的一种需求:要求某个功能模块或任务在相同的时间周期内进行循环执行。这里有了一个定时器的概念,具体而言我们应该如何去实现一个定时器呢?定时器有许多很实用的功能,能够控制线程的执行、减少系统的消耗等。现在我们来动手实践实现python3中的定时功能吧。

比如使用Python在进行爬虫系统开发时可能就需要间隔一段时间就重复执行的任务的需求,从而实现一个线程服务在后台监控数据的抓取状态,这里定时器就可以帮忙了。

【视频推荐:Python3视频教程】

【手册推荐:Python中文手册】

立即学习“Python免费学习笔记(深入)”;

通过Python的文档我们可以找到threading.Timer()来实现定时功能:

简单实现代码:

import threadingdef func1(a):    #Do something    print('Do something')    a+=1    print(a)    print('当前线程数为{}'.format(threading.activeCount()))    if a>5:        return    t=threading.Timer(5,func1,(a,))    t.start()

效果图:

通过查阅资料,利用Python能实现三种不同的定时任务执行方式:

1.定时任务代码

#!/user/bin/env python#定时执行任务命令import time,os,schedschedule = sched.scheduler(time.time,time.sleep)def perform_command(cmd,inc):  os.system(cmd)  print('task')def timming_exe(cmd,inc=60):  schedule.enter(inc,0,perform_command,(cmd,inc))  schedule.run()print('show time after 2 seconds:')timming_exe('echo %time%',2)

2.周期性执行任务

#!/user/bin/env pythonimport time,os,schedschedule = sched.scheduler(time.time,time.sleep)def perform_command(cmd,inc):  #在inc秒后再次运行自己,即周期运行  schedule.enter(inc, 0, perform_command, (cmd, inc))  os.system(cmd)def timming_exe(cmd,inc=60):  schedule.enter(inc,0,perform_command,(cmd,inc))  schedule.run()#持续运行,直到计划时间队列变成空为止print('show time after 2 seconds:')timming_exe('echo %time%',2)

3.循环执行命令

#!/user/bin/env pythonimport time,osdef re_exe(cmd,inc = 60):  while True:    os.system(cmd)    time.sleep(inc)re_exe("echo %time%",5)

总结而言:Python实现定时器的方法都是schedule和threading的实现,具体的用法还要根据实际情况灵活运用。

最常用的两个模块:threading、Sched

threading模块使用:

import threading ,timefrom time import sleep, ctimeclass Timer(threading.Thread):        """        very simple but useless timer.        """        def __init__(self, seconds):                self.runTime = seconds                threading.Thread.__init__(self)        def run(self):                time.sleep(self.runTime)                print ("Buzzzz!! Time's up!")class CountDownTimer(Timer):        """        a timer that can counts down the seconds.        """        def run(self):                counter = self.runTime                for sec in range(self.runTime):                        print (counter)                        time.sleep(1.0)                        counter -= 1                print ("Done") class CountDownExec(CountDownTimer):        """        a timer that execute an action at the end of the timer run.        """        def __init__(self, seconds, action, args=[]):                self.args = args                self.action = action                CountDownTimer.__init__(self, seconds)        def run(self):                CountDownTimer.run(self)                self.action(self.args) def myAction(args=[]):        print ("Performing my action with args:")        print (args) if __name__ == "__main__":        t = CountDownExec(3, myAction, ["hello", "world"])        t.start()        print("2333")

Sched模块使用:

'''使用sched模块实现的timer,sched模块不是循环的,一次调度被执行后就Over了,如果想再执行,可以使用while循环的方式不停的调用该方法'''import time, sched#被调度触发的函数def event_func(msg):    print("Current Time:", time.strftime("%y-%m-%d %H:%M:%S"), 'msg:', msg)def run_function():    #初始化sched模块的scheduler类    s = sched.scheduler(time.time, time.sleep)    #设置一个调度,因为time.sleep()的时间是一秒,所以timer的间隔时间就是sleep的时间,加上enter的第一个参数    s.enter(0, 2, event_func, ("Timer event.",))    s.run()def timer1():    while True:        #sched模块不是循环的,一次调度被执行后就Over了,如果想再执行,可以使用while循环的方式不停的调用该方法        time.sleep(1)        run_function()if __name__ == "__main__":    timer1()