14

1分に1回だけスクリプトの一部を実行していて、これを思いつきました:

def minutePassed(oldminute):
    currentminute = time.gmtime()[4]

    if ((currentminute - oldminute) >= 1) or (oldminute == 59 and currentminute >= 0):
        return True
    else:
        return False

ここでの問題は、分が 59 の場合、その時間が経過するまで毎回実行されることです。しかし、私はまだそれが起こるのが好きではありません!

私は今、次のようなことを考えました:

def minutePassed(oldminute):
    currentminute = time.gmtime()[4]

    if ((currentminute - oldminute) >= 1) or (oldminute == 59 and currentminute >= 0 and ran == false):
        ran = True
        return True
    else:
        return False

次に、スクリプトの別の部分で、分が != 59 で、変数がまだ false ではないときに、再び false を実行しましたが、それは大雑把に思えますか?

別のメモ-分が経過したかどうかを確認する他の方法はありますか? 多分私は物事を複雑にしています...

編集:多分私は十分に明確ではありませんでした:

  1. 1 分間に 1 回だけ実行します。
  2. 実行時間は数秒で異なりますが、30 秒未満かかります。

私は今 timedelta を見ています。

4

6 に答える 6

23

そのような議事録は使用しないでください。たとえば、時刻が 00:00:59 の場合、コードは 1 分が次の 1 秒を過ぎたと認識します。

代わりにtime.time()、エポックから経過した秒数を返す のようなものを使用します。

def minute_passed(oldepoch):
    return time.time() - oldepoch >= 60

同じ理由で、それでもほぼ 1 秒ずれることがありますが、それはおそらくより許容範囲内です。

于 2013-04-14T14:27:38.557 に答える
1

「エポック」から経過した秒数を返すモジュールのtime()関数を使用する方がはるかに簡単であることがわかると思います。time

import time

oldtime = time.time()

def minutePassed(oldtime):
    currenttime = time.time()
    if currenttime - oldtime > 60 and ran == False:
        ran = True
        return True
    else:
        return False
于 2013-04-14T14:29:37.943 に答える
0

私は timedelta であまり成功しなかったので、以前の大雑把な考えに行きました:

def minutePassed(oldminute):
    currentminute = time.gmtime()[4]

    if ((currentminute - oldminute) >= 1) or (oldminute == 59 and currentminute == 0):
        return True
    else:
        return False

次に、スクリプトで:

while True:
    dosomething()

    if minutePassed(time.gmtime(lastrun)[4]):
        domore
        lastrun = time.time()

これは今私にとっては完全にうまく機能します.1分に1回しか実行されません.各ループの実行時間は信頼できないため、ここでは睡眠などは悪い選択です.

于 2013-04-14T15:41:49.823 に答える