Python 个每分钟不间断运行的脚本

Python scripts that runs every minute without stoping

我有一个 Python 脚本,它每 1 分钟向我的 API 发送一个 post 请求:

while True:
    data = requests.post("URL_HERE", json={
        "api_key":"XXXX",
        "concat": 1,
        "messages": "HI"
    })
    time.sleep(60)

一切正常,但每 2 小时(或多或少)同一分钟有 2 条记录。示例:

2017-03-22 11:34:46.977255
2017-03-22 11:37:47.231694
2017-03-22 11:37:47.231694
2017-03-22 11:39:48.849003
2017-03-22 11:40:48.907895
...
2017-03-23 13:59:59.150108
2017-03-23 14:00:00.120431
2017-03-23 14:00:00.942033

我想这是因为 "while" 中的代码需要几毫秒才能执行,因此,每 2-3 小时一分钟将有两条记录。

有人知道我该如何解决这个问题吗?我不能使用 cronjobs。

可能是异步任务?

如果我想让这个程序永远执行,使用 "while" 是没问题的,还是我应该创建一个类似的守护进程?

您可以等待当前分钟的剩余秒数,而不是等待 60 秒:

time.sleep(60 - datetime.datetime.now().second)

如果您的作业完成时间较晚 datetime.datetime.now().second 将是 12,您将等待 5958 秒。

看看this post。使用调度程序可能会成功。在您的代码中使用该答案将如下所示。

import sched, time, requests
schedul = sched.scheduler(time.time, time.sleep)

def send_post():
    data = requests.post("URL_HERE", json={
        "api_key": "XXXX",
        "concat": 1,
        "messages": "HI"
    })

schedul.enter(60, 1, send_post(), (schedul,))
schedul.run()  

如果你跟踪时间,你可以确保你不会重复或有时间漂移。

这里有一个例子

interval = 60
next = time.time() + interval

while True:
    if time.time() >= next :
        data = requests.post("URL_HERE", json={
            "api_key":"XXXX",
            "concat": 1,
            "messages": "HI"
        })
        next = next + interval
    time.sleep(next - time.time())