1

USB ウェザー ステーションからデータを取得する Python スクリプトがあります。ステーションからデータを受信するたびに、データを MySQL に入れます。

私は挿入機能を備えたMySQLクラスを持っています。機能が最後の5分間に実行されたかどうかをチェックして終了する必要があります。

これを行うコードをインターネット上で見つけることができませんでした。

サブプロセスが必要かもしれませんが、私はそれについてまったく知りません。

誰かが私が使用できる例を持っていますか?

4

5 に答える 5

2

このタイムアウト デコレータを使用します。

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()
于 2012-04-28T18:44:05.877 に答える
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

補足として:関連するものをWeb検索しているときにRRDToolに気づきましたか?それはあなたが達成したいことを明らかにします、すなわち

  • 任意の解像度/更新頻度の最新の値を保存するデータベース。
  • 更新が頻繁すぎるか欠落している場合の値の外挿/補間。
  • データからグラフを生成します。

アプローチとしては、MySQLデータベースに取得できるすべてのデータを保存し、サブセットをそのようなRRDToolデータベースに転送して、その時系列の視覚化を生成することが考えられます。あなたが必要とするかもしれないものに応じて。

于 2012-04-28T19:27:02.693 に答える
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)

最初の引数は実行する関数、2番目は時間間隔、3番目はその時間間隔で実行できる回数です。

于 2012-04-28T19:01:21.913 に答える
0

関数が実行されるたびに、現在の時刻でファイルを保存します。関数が再度実行されるときに、ファイルに保存されている時刻を確認し、十分に古いことを確認してください。

于 2012-04-28T18:41:21.493 に答える
0

新しいクラスに派生し、挿入関数をオーバーライドするだけです。上書き機能では、前回の挿入時刻を確認し、5 分以上経過していれば父の挿入メソッドを呼び出し、もちろん最新の挿入時刻を更新します。

于 2012-04-28T18:43:04.043 に答える