【问题标题】:How to use APScheduler in Python to run program daily at exact time?如何在 Python 中使用 APScheduler 每天在准确的时间运行程序?
【发布时间】:2021-08-20 13:05:22
【问题描述】:

我正在尝试在每天第二秒的准确时间运行某些东西。 我已经尝试过 Schedule 并使用了 1 秒的睡眠时间,但它有时会运行两次,所以我想切换到 APScheduler。但是我从来没有像以前那样使用过任何 Cron,而且他们网页的“用户指南”根本不像详细的文档,所以我不知道从哪里开始。谷歌搜索,但只有间隔的答案。我想指定时间而不是间隔。

例如每天 03:00:05 运行一个函数。你会怎么做?

谢谢。

【问题讨论】:

  • 你尝试了什么?

标签: python apscheduler


【解决方案1】:

我相信你想要的是来自 APScheduler 的 BackgroundScheduler 使用 CronTrigger

该程序的一个最小示例如下:

from time import sleep

from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger


def foo(bar):
    print(bar)


def main():
    scheduler = BackgroundScheduler()
    scheduler.start()

    trigger = CronTrigger(
        year="*", month="*", day="*", hour="3", minute="0", second="5"
    )
    scheduler.add_job(
        foo,
        trigger=trigger,
        args=["hello world"],
        name="daily foo",
    )
    while True:
        sleep(5)


if __name__ == "__main__":
    main()

这将在每天 03:00:05 运行函数 foo,参数 bar 等于字符串“hello world”。

后台调度程序没有阻塞,因此需要while循环来保持程序永远运行。

要更改要调用的函数,您只需将scheduler.add_job 的第一个参数更改为您要调用的函数,并将args 关键字参数更改为包含您希望调用函数的参数的列表与。

CronTrigger 的参数形成一个 cron 字符串,这是 Linux 中 crontab 实用程序使用的众所周知的格式(我发现 the following site 对于测试这些字符串非常有用。)

【讨论】:

  • 我试图运行代码但它返回 NameError: name 'function' is not defined
  • 调度器在指定时间运行同一个函数6次,知道为什么吗?
  • 是否会多次运行相同的代码在 jupyter notebook 上进行测试? scheduler.shutdown() 会解决吗?
  • 如果您多次运行scheduler.add_job 函数,那么这可能就是原因。每次运行它都会安排另一个作业。确保您可以检查scheduler.get_jobs() 的长度。
【解决方案2】:

我会编写自己的函数。

from time import time, ctime
def your_function():
   pass

if __name__ == "__main__":
    while True:
        now = ctime(time())[11:19]
        if now == "12:34:56":
            try:
                your_function()
                sleep(1.25)
            except:
                pass # or raise
        else:
            sleep(0.75)

这应该可以完成工作。

【讨论】:

    猜你喜欢
    • 2021-03-02
    • 1970-01-01
    • 2012-05-04
    • 2012-08-09
    • 1970-01-01
    • 2015-11-28
    • 2019-08-01
    • 2015-10-12
    • 1970-01-01
    相关资源
    最近更新 更多