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
将是 1
或 2
,您将等待 59
或 58
秒。
看看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())
我有一个 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
将是 1
或 2
,您将等待 59
或 58
秒。
看看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())