我有一个要求,我需要每5秒运行一次任务,但只在特定时间之间(如明天1:30到2:30之间)。
我查看了芹菜,但是芹菜中不能重复执行正常任务,并且无法动态安排定期任务。
我也看过APScheduler,但是它并不支持将它作为守护进程运行。并从外部安排任务。
知道我可以用什么来实现这个目标吗?
编辑:之前应该提到这一点,我需要在Web请求中执行此操作,例如后台任务。
答案 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,因为这是您可能想要澄清的内容。
如果需要并行运行,您可能需要查看threading,multiprocessing或新的asyncio模块。
(由于代理限制无法链接Asyncio)