我有一個從USB氣象站獲取數據的python腳本,現在只要從站接收到數據就會將數據存入MySQL。Python,函數退出,如果它已經運行最後5分鐘
我有一個MySQL類與插入功能,我想我的功能檢查,如果它已經運行最後5分鐘,如果有,退出。
在互聯網上找不到任何代碼。
也許我需要一個子過程,但我對此一點都不熟悉。
有沒有人有我可以使用的例子?
我有一個從USB氣象站獲取數據的python腳本,現在只要從站接收到數據就會將數據存入MySQL。Python,函數退出,如果它已經運行最後5分鐘
我有一個MySQL類與插入功能,我想我的功能檢查,如果它已經運行最後5分鐘,如果有,退出。
在互聯網上找不到任何代碼。
也許我需要一個子過程,但我對此一點都不熟悉。
有沒有人有我可以使用的例子?
也許最直接的方法(你可以把這個變成一個裝飾,如果你喜歡,但是這只是化妝品我認爲):
import time
import datetime
class MySQLWrapper:
def __init__(self, min_period_seconds):
self.min_period = datetime.timedelta(seconds=min_period_seconds)
self.last_calltime = datetime.datetime.now() - self.min_period
def insert(self, item):
now = datetime.datetime.now()
if now-self.last_calltime < self.min_period:
print "not insert"
else:
self.last_calltime = now
print "insert", item
m = MySQLWrapper(5)
m.insert(1) # insert 1
m.insert(2) # not insert
time.sleep(5)
m.insert(3) # insert 3
作爲一個側面說明:你有沒有注意到RRDTool在您的網絡搜索相關的東西?它確實實現了你想要達到的目的,即
的方法可以是商店,你可以進入你的MySQL數據庫的所有數據和一個子集轉發給此類RRDTool的數據庫,生成的是一個很好的時間序列可視化。取決於你可能需要什麼。 「
每次函數運行時都會保存一個當前時間的文件。當再次運行該功能時,請檢查存儲在文件中的時間,並確保它足夠長。
只需派生一個新的類並重寫插入函數。在覆蓋函數中,檢查最後一次插入時間並調用父插入方法(如果超過五分鐘),並且更新最近插入時間。
使用this超時裝飾器。
import signal
class TimeoutError(Exception):
def __init__(self, value = "Timed Out"):
self.value = value
def __str__(self):
return repr(self.value)
def timeout(seconds_before_timeout):
def decorate(f):
def handler(signum, frame):
raise TimeoutError()
def new_f(*args, **kwargs):
old = signal.signal(signal.SIGALRM, handler)
signal.alarm(seconds_before_timeout)
try:
result = f(*args, **kwargs)
finally:
signal.signal(signal.SIGALRM, old)
signal.alarm(0)
return result
new_f.func_name = f.func_name
return new_f
return decorate
用法:
import time
@timeout(5)
def mytest():
print "Start"
for i in range(1,10):
time.sleep(1)
print "%d seconds have passed" % i
if __name__ == '__main__':
mytest()
import time
def timeout(f, k, n):
last_time = [time.time()]
count = [0]
def inner(*args, **kwargs):
distance = time.time() - last_time[0]
if distance > k:
last_time[0] = time.time()
count[0] = 0
return f(*args, **kwargs)
elif distance < k and (count[0]+1) == n:
return False
else:
count[0] += 1
return f(*args, **kwargs)
return inner
timed = timeout(lambda x, y : x + y, 300, 1)
print timed(2, 4)
第一個參數是你想運行的功能,二是時間間隔,第三個是次數它允許在該時間間隔運行。
」無法在互聯網上找到任何代碼。「試圖毫不費力地做到這一點[你自己做了什麼?](http://mattgemmell.com/2008/12/08/what-have-you-tried/)。 [計算器不是「你的個人研究助手」。](http://meta.stackexchange.com/a/128553/179419) – Ben 2012-04-28 18:38:47
用計時器計算程序運行的時間量 – Kyle 2012-04-28 18:39:47
看看Python中的各種函數對於時間戳和在子流程文檔中的比較也是如此。但我不是python的專家,所以如果我能得到一些關於如何攻擊這個想法的輸入或提示,這將是很好的:) – HyperDevil 2012-04-28 18:41:11