Python中定时任务的解决方案,总体来说有四种,分别是:crontab、 scheduler、 Celery、 APScheduler,其中 crontab不适合多台服务器的配置、scheduler太过于简单、 Celery依赖的软件比较多,比较耗资源。最好的解决方案就是 APScheduler,近期使用apscheduler执行了许多定时任务,感受还是挺不错的
jar_crond.py代码
#引入需要的库
import os
from subprocess import getstatusoutput
from datetime import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
class Timetask:
"""不同方式执行定时任务的类"""
def tick(self, _chdir, cmd):
"""切换工作目录并执行命令的方法"""
_chdir = os.chdir(_chdir)
_getcwd = os.getcwd()
_cmd = getstatusoutput(cmd)
__cmd = _cmd[0]
tnow = datetime.now()
if __cmd is 0:
print("命令执行成功", tnow)
else:
raise SystemExit("命令执行失败, Error:{}".format(_cmd)) #执行失败时手动抛出异常
return _chdir, cmd
def interval_task(self):
"""间隔性执行任务的方法"""
try:
blocking = BlockingScheduler() #实例化父类
blocking.add_job(self.tick, 'interval', seconds=3) #每三秒执行一次
blocking.start()
except (Exception, SystemExit, KeyboardInterrupt) as e:
print("发生了未知的错误或用户已手动结束任务,Error{}".format(e))
def cron_task(self):
"""定时执行任务的方法"""
try:
blocking = BlockingScheduler() #实例化父类
#早上9点55分执行,参数kwargs代表使用此方式传参,如果不封装函数的情况下,可以使用其他参数
blocking.add_job(self.tick, 'cron', hour=9, minute=55, kwargs={'_chdir':'/usr/local/nginx/sbin/', 'cmd':'./nginx'})
blocking.start()
except (Exception, SystemExit, KeyboardInterrupt) as e:
print("发生了未知的错误或用户已手动结束任务,Error{}".format(e))
if __name__ == '__main__':
"""主函数"""
timetask = Timetask() #实例化类
print("等待定时任务执行,waiting……")
timetask.cron_task() #调用定时执行任务的方法
执行后: