我有一个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”就可以了,或者我应该创建一个类似的守护进程?
答案 0 :(得分:4)
您可以等待当前一分钟的剩余秒数,而不是等待60秒:
time.sleep(60 - datetime.datetime.now().second)
如果您的工作迟到datetime.datetime.now().second
将是1
或2
,您将等待59
或58
秒。
答案 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())