特定の間隔で実行する必要があるプログラムがあります。たとえば、5 分ごとに実行したい場合があります。複数のエンド ノード デバイスと通信する複数のコーディネータがあります。以下のコードはコーディネーターにあります。が 5 に設定されている場合、interval
たとえば 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