2012-04-28 44 views
1

我有一個從USB氣象站獲取數據的python腳本,現在只要從站接收到數據就會將數據存入MySQL。Python,函數退出,如果它已經運行最後5分鐘

我有一個MySQL類與插入功能,我想我的功能檢查,如果它已經運行最後5分鐘,如果有,退出。

在互聯網上找不到任何代碼。

也許我需要一個子過程,但我對此一點都不熟悉。

有沒有人有我可以使用的例子?

+3

」無法在互聯網上找到任何代碼。「試圖毫不費力地做到這一點[你自己做了什麼?](http://mattgemmell.com/2008/12/08/what-have-you-tried/)。 [計算器不是「你的個人研究助手」。](http://meta.stackexchange.com/a/128553/179419) – Ben 2012-04-28 18:38:47

+0

用計時器計算程序運行的時間量 – Kyle 2012-04-28 18:39:47

+0

看看Python中的各種函數對於時間戳和在子流程文檔中的比較也是如此。但我不是python的專家,所以如果我能得到一些關於如何攻擊這個想法的輸入或提示,這將是很好的:) – HyperDevil 2012-04-28 18:41:11

回答

1

也許最直接的方法(你可以把這個變成一個裝飾,如果你喜歡,但是這只是化妝品我認爲):

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的數據庫,生成的是一個很好的時間序列可視化。取決於你可能需要什麼。 「

0

每次函數運行時都會保存一個當前時間的文件。當再次運行該功能時,請檢查存儲在文件中的時間,並確保它足夠長。

0

只需派生一個新的類並重寫插入函數。在覆蓋函數中,檢查最後一次插入時間並調用父插入方法(如果超過五分鐘),並且更新最近插入時間。

2

使用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() 
1
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) 

第一個參數是你想運行的功能,二是時間間隔,第三個是次數它允許在該時間間隔運行。