我有一个程序需要在一定的时间间隔内执行。例如,我可能希望它每五分钟执行一次。我有几个与多个终端节点设备通信的协调器。下面的代码在协调器上。我需要它,以便如果interval
设置为 5,那么它会运行并记录信息,例如: 9: 05、9:10、9:15、9 :20、9:25等。我到目前为止的代码是如下:
if __name__ == '__main__':
while True:
try:
r = json.read(rqst_command())
interval = r.get('intvl')
collect_time = r.get('c_time')
command = r.get('cmd')
send_stats(cmd_nodes(command, collect_time))
time.sleep(interval)
except Exception, e:
print e
print "**Top Level Exception"
pass
问题是,如果我将间隔设置为5 分钟,它不会每 5 分钟准确记录一次。执行时间似乎在慢慢增加。例如,上面的代码可能会记录为9:05:09, 9:10:19, 9:15:29, 9:20:41, 9:25:50。程序运行所需的时间取决于节点通信的速度。
有人对我如何更改代码以使程序每 5 分钟执行一次有任何想法吗?
编辑/更新
我想我已经找到了解决问题的方法。我抓住电流datetime
,然后检查它是否在 5 分钟标记上。如果是,则记录datetime
并将其发送到send_stats
函数。这样一来,datetime
它将永远是我想要的。如果它不在 5 分钟标记上sleep
,请稍等片刻,然后再次检查。我的代码大部分都完成了。但是,当我运行程序时出现以下错误:'builtin_function_or_method' object has no attribute 'year'
.
我做错了什么?
这是我的新代码:
import os
import json
import datetime
from datetime import datetime
import urllib2
from urllib import urlencode
from socket import *
import time
import zigbee
import select
if __name__ == '__main__':
while True:
try:
r = json.read(rqst_command())
interval = r.get('intvl')
collect_time = r.get('c_time')
command = r.get('cmd')
tempTest = True
while tempTest == True:
start_time = datetime.now
compare_time = datetime(start_time.year, start_time.month, start_time.day, start_time.hour, 0, 0)
difff = int((start_time - compare_time).total_seconds() / 60)
if((difff % interval) == 0):
c_t = datetime(start_time.year, start_time.month, start_time.day, start_time.hour, start_time.minute, 0)
send_stats(cmd_nodes(command, collect_time), c_t)
tempTest = False
else:
time.sleep(30)
except Exception, e:
print e
print "**Top Level Exception"
pass