如何在python中以特定时间间隔定期运行任务?

时间:2015-12-30 14:35:22

标签: python asynchronous celery apscheduler

我有一个要求,我需要每5秒运行一次任务,但只在特定时间之间(如明天1:30到2:30之间)。

我查看了芹菜,但是芹菜中不能重复执行正常任务,并且无法动态安排定期任务。

我也看过APScheduler,但是它并不支持将它作为守护进程运行。并从外部安排任务。

知道我可以用什么来实现这个目标吗?

编辑:之前应该提到这一点,我需要在Web请求中执行此操作,例如后台任务。

2 个答案:

答案 0 :(得分:2)

如果我理解你的问题,也许是这样的?

from time import sleep
from datetime import datetime


if 90 <= datetime.now().hour * 60 + datetime.now().minute <= 150:
    # Do something
    time.sleep(5)

我将时间转换为分钟,以便更轻松地处理时间。所以90分钟是1.30,150分钟是2.30。 (被认为是AM)

时间模块以5秒的间隔运行。

如果您还需要几天,可以通过以下方式轻松实现;

datetime.now().day

你需要把它放到一个循环中,以便持续测试条件。我使用的睡眠方法将导致每5秒检查一次。

由于您添加的代码无法阻止该过程。另一种方法可能是使用除法。喜欢的东西;

While #condition:
    if not datetime.now().second % 5:
        # Process

但当然我必须补充说,这是一个糟糕的解决方案,因为它总是运行。所以我相信使用合适的库会更有帮助,目前我不知道。

答案 1 :(得分:1)

我认为@ Rockybilly的答案非常接近,如果你想要一个完全python特定的答案。但是,您需要将其包装在:

While True:
#@Rockybilly's if statement

这是重复该过程所必需的。您还想加入如下所示的内容: delay a task until certain time

您可以在指定范围之外(例如2:31)执行此操作,然后将脚本休眠到第二天的1:30。这将有助于确保它不会持续运行。

正如人们所评论的那样,您可以使用CRON(Unix)或任务计划程序(Windows)以某种身份执行此操作

-

由于您已编辑了问题,我将在此处添加对该编辑的回复。请参阅下面的评论,以回应@Rockybilly,因为这是您可能想要澄清的内容。

如果需要并行运行,您可能需要查看threadingmultiprocessing或新的asyncio模块。

(由于代理限制无法链接Asyncio)