Python中调度器的重试机制

问题描述

我一直致力于在 python 中调度任务。有两种情况

  1. 调度程序需要每小时访问服务器以获取该小时的数据(200 ok)
  2. 重试机制:如果服务器端出现任何故障(即 response ),它必须每 30 秒命中一次,直到来自服务器的响应为 200 ok。 下面的代码已经试过了。

例如:成功---1hr---成功---1hr---失败---30sec---失败---30sec---成功---1hr---失败---30sec

class sched:
    scheduler = BackgroundScheduler(timezone=utc)
    startTime = datetime.Now
    
    def __init__(self,tm:TM,scheduler):
        self.tm = tm
        self.code = tm.fun1()
        self.job = scheduler.add_job(self.tm.fun1,trigger='interval',hour = '1',timezone='UTC')

    def start_sched(self,scheduler):
        if (scheduler.state != STATE_STOPPED) is False: #Scheduler is not running
            scheduler.start()
            
    def retry_sched(self,scheduler,code):
        if (scheduler.state != STATE_STOPPED) is True: #Scheduler is running 
            if self.code is False: #But some failure happens
                time.sleep(30) #For Every 30 secs it has to hit back
                scheduler.start()
        

我能够运行调度程序并且它每小时都成功命中。但是当服务器的响应不成功时,即使如此也需要1小时才能再次命中。

如果失败,我是否需要创建新工作?不是双重工作吗? 有没有办法在成功和失败的情况下运行相同的工作。 请帮帮我,我真的很震惊。

解决方法

我可能会将重试循环保留在当前线程中,如下所示:

def retry_sched(self,scheduler,code):
    if (scheduler.state != STATE_STOPPED):  # Scheduler is running
        while not self.code:  # But some failure happens
            time.sleep(30)  # For Every 30 secs it has to hit back
        

您可能需要考虑一些重试次数,以便在失败次数过多后退出循环。

,

不,您不需要单独的工作,simple-scheduler 只需一次调用即可完成所有工作。您需要做的就是在 status != 200 时引发异常,然后重试机制将自动启动。

from simple_scheduler.recurring import recurring_scheduler

def your_function():
    status = ...
    if status != 200:
        raise Exception("Oh no!")
    else:
    // do your job

recurring_scheduler.add_job(target=your_function,period_in_seconds=60*60,job_name="your_function",number_of_reattempts=3,reattempt_duration_in_seconds=30)
recurring_scheduler.job_summary()
recurring_scheduler.run()
recurring_scheduler.job_summary()

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...