我有一个要求,我需要每5秒运行一次任务,但只能在特定时间之间运行(比如明天1:30到2:30之间)。
我看了芹菜,但一个正常的任务不能在芹菜中重复执行,周期性任务也不能动态调度。
我还研究了APScheduler,但它不支持将其作为"守护进程"运行,也不支持从外部调度任务。
你知道我能用什么来实现这一点吗?
编辑:我应该在前面提到这一点,我需要在网络请求时这样做,就像后台任务一样。
如果我理解你的问题,也许是这样?
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
但我当然必须补充一点,这是一个糟糕的解决方案,因为它总是运行。所以我相信使用一个合适的图书馆会更有帮助,这在我目前还不知道。
如果你想要一个完全针对python的答案,我认为@Rockybilly的答案非常接近。然而,您需要将其封装在一个:中
While True:
#@Rockybilly's if statement
这是重复该过程所必需的。您还希望包含以下内容:将任务延迟到特定时间
您可以在指定范围之外(例如2:31)执行一次此操作,然后将脚本睡眠到第二天1:30。这将有助于确保它不会一直运行。
正如人们所评论的那样,您可以使用CRON(Unix)或任务调度程序(Windows)以一定的能力完成这项工作
--
既然你已经编辑了你的问题,我将在这里添加对该编辑的回应。请参阅我在下面对@Rockybilly的评论,因为这是你可能想澄清的事情。
如果线程、多处理或新的异步模块需要并行运行,您可能需要研究这些模块。
(由于rep限制,无法链接Asyncio)