【问题标题】:APScheduler how to trigger job nowAPScheduler 如何立即触发作业
【发布时间】:2015-08-26 15:35:23
【问题描述】:

我在 Flask 应用中有一个 APScheduler,每隔一段时间发送事件。

现在我需要“刷新”所有作业,实际上只是现在启动它们,如果它们没有在定义的时间间隔内运行。

我尝试调用 job.pause() 然后调用 job.resume() 什么都没有,并使用 job。 reschedule_job(...) 会触发它,但也会改变间隔......这是我不想要的。

我的实际代码如下:

cron = GeventScheduler(daemon=True)
# Explicitly kick off the background thread
cron.start()

cron.add_job(_job_time, 'interval', seconds=5, id='_job_time')
cron.add_job(_job_forecast, 'interval', hours=1, id='_job_forecast_01')

@app.route("/refresh")
def refresh():
    refreshed = []
    for job in cron.get_jobs():
         job.pause()
         job.resume()
         refreshed.append(job.id)
    return json.dumps( {'number': len(cron.get_jobs()), 'list': refreshed} )

【问题讨论】:

    标签: python apscheduler


    【解决方案1】:

    我不鼓励按照接受的答案中的建议致电job.func()。调度程序不会知道作业正在运行这一事实,并且会扰乱常规调度逻辑。

    改为使用作业的modify() 函数将其next_run_time 属性设置为now():

    for job in scheduler.get_jobs():
        job.modify(next_run_time=datetime.now())
    

    Also refer to the actual implementation of class Job.

    【讨论】:

    • 您知道更改 next_run_time 是否会干扰日程安排吗?例如。如果间隔是x,我修改它时,下次运行会从next_run_time变成x吗?
    • 如果我正确理解了您的问题和 APScheduler,那么作业应该在您使用next_run_time 指定的时间点 运行(而不是之后的预定义运行间隔时间点)
    • 不是我的问题。我添加了设置间隔的作业,我想知道以前计划的下一次运行(由间隔设置)是否会受到修改下一次运行时间的影响。我想这只是意味着在interval 再次通过之前,该工作不会再次运行?
    • 快速浏览APScheduler 的源代码,它确实似乎按照您描述的方式工作(调度程序将在手动触发运行后等待另一个时间间隔)。这是一种透明、直接的方法。
    • 如果作业暂停,此方法将立即运行作业,但将其状态从暂停更改为活动。
    【解决方案2】:

    作为一种解决方法,我使用了以下方法。 总之,我循环遍历所有作业 cron.get_jobs() 并使用 Job 对象创建一个一次性作业到“日期”触发器,该触发器仅在 datetime.now 触发一次,因为未指定。

    def refresh():
        refreshed = []
        for job in cron.get_jobs():
            cron.add_job(job.func, 'date', id='{0}.uniq'.format(job.id), max_instances=1)
            refreshed.append(job.id)
        return json.dumps( {'number': len(cron.get_jobs()), 'list': refreshed} )
    

    【讨论】:

    • 同样早在 2 年前,我已经发布了一个新答案,该答案将使用户能够现在使用适当的调度机制来开始工作。
    【解决方案3】:

    答案很晚,但我认为您需要的是简单地调用“刷新”路线中的方法。

    【讨论】:

      【解决方案4】:

      您也可以直接运行作业功能。

      for job in cron.get_jobs():
          job.func() 
      

      如果您将 args 或 kwargs 传递到函数中,则必须将它们从 job.args 和/或 job.kwargs 中提取出来。见apscheduler.job.Job

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-04
        • 2021-03-31
        • 1970-01-01
        相关资源
        最近更新 更多