每分钟运行而不会停止的Python脚本

时间:2017-03-23 14:30:35

标签: python django daemon

我有一个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”就可以了,或者我应该创建一个类似的守护进程?

3 个答案:

答案 0 :(得分:4)

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

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

如果您的工作迟到datetime.datetime.now().second将是12,您将等待5958秒。

答案 1 :(得分:2)

看看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()  

答案 2 :(得分:1)

如果你跟踪时间,你可以确保你没有复制或有时间漂移。

这是一个例子

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())