【问题标题】:How to run a task in python for regular intervals between certain times? [duplicate]如何在 python 中在特定时间之间定期运行任务? [复制]
【发布时间】:2016-04-04 13:06:20
【问题描述】:

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

我看了一下celery,但是一个正常的任务不能在celery中重复执行,周期任务不能动态调度。

我还查看了 APScheduler,但它不支持将其作为“守护程序”运行并从外部调度任务。

知道我可以用什么来实现这一点吗?

编辑:应该在前面提到这一点,我需要在网络请求期间执行此操作,例如后台任务。

【问题讨论】:

  • 这通常是在你的系统上使用crontab的等价物来完成的(windows曾经有一个at命令,不知道它是否仍然存在于最近的版本中)。

标签: python asynchronous celery apscheduler


【解决方案1】:

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

While True:
#@Rockybilly's if statement

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

您将在指定范围之外执行一次(例如 2:31),然后将脚本休眠到第二天 1:30。这将有助于确保它不会一直运行。

正如人们评论的那样,您可以在某种程度上使用 CRON (Unix) 或 Task Scheduler (Windows) 来执行此操作

--

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

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

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

【讨论】:

  • 感谢您的指出,我实际上是在几分钟前添加的:)
  • @Rockybilly 我明白了!伟大的!我无法在上面发表评论(没有足够的代表),但我认为 E 先生在您的 cmets 中所说的是该函数将休眠 5 秒 + 运行脚本所需的任何时间。因此,如果脚本需要 20 秒的时间运行,它将导致 25 秒的间隔。我认为这是OP需要澄清的事情。 OP 是否需要每 5 秒得到一次结果?该过程是否需要每 5 秒运行一次(了解结果时间可能因负载而异)?或者,要求只是处理之间的 5 秒间隔?
【解决方案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

并且您需要将其放入循环中,以便不断测试条件。我使用的 sleep 方法将导致每 5 秒检查一次。

在您添加时,代码不能阻塞进程。另一种方法是使用除法。类似的东西;

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

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

【讨论】:

  • sleep 如果您需要精度,这不是一个好的功能。它只会将进程放入调度程序中的锁定队列,然后放入就绪队列,它不会在 5 秒后继续该进程。为此,您应该使用clock signal
  • 你确实是对的。我只是在想一种方法来避免这个问题。 :) 但是在这个例子中,我认为它可以按预期工作,因为分钟可以被 5 整除
  • 谢谢。但是我需要在网络请求期间安排任务,它不能被阻塞。如果我将此脚本作为守护程序运行并让它在特定时间间隔从网络代码触发一个函数。
猜你喜欢
  • 2010-11-05
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 2012-02-21
  • 2013-12-21
相关资源
最近更新 更多