単純なアプローチでは、 を に変更しすぎpass
てsleep (1)
CPU の負荷が大幅に軽減されますが、何らかの理由12:30:59.99999
で12:31:01.00001
.
2 段階のアプローチを選択できます。残り 3 秒以上ある場合は、残りの時間に基づいて、より長い時間待機します。それ以外の場合は、1 秒待ちます。
次の完全に機能する Python プログラムのようなものは、私の言いたいことを示しています。
from datetime import datetime
from time import sleep
def WaitForNextMinute():
secs = datetime.utcnow().second
while secs < 57:
sleep (57 - secs)
secs = datetime.utcnow().second
while datetime.utcnow().second >= 57:
sleep (1)
while True:
WaitForNextMinute()
print datetime.utcnow()
私のシステムの出力は次のとおりです。
2012-08-25 04:16:00.111257
2012-08-25 04:17:00.157155
2012-08-25 04:18:00.217356
2012-08-25 04:19:00.270348
2012-08-25 04:20:00.330203
2012-08-25 04:21:00.390318
2012-08-25 04:22:00.450440
2012-08-25 04:23:00.510491
2012-08-25 04:24:00.570487
2012-08-25 04:25:00.630502
2012-08-25 04:26:00.690523
2012-08-25 04:27:00.750642
2012-08-25 04:28:00.810780
2012-08-25 04:29:00.870900
2012-08-25 04:30:00.931078
それはあなたが求めているものです。
この関数は基本的に、分の終わりに非常に近づくまで 1 回の待機を行い、サイクルが終了するまで毎秒ウェイクアップします。
たとえば、それが であるとしましょう12:21:13
。secs
未満ですので、程度までお持ちいただくのに十分か57
お待ちいただくことになります。57 - 13
12:21:57
そこから、second
が 未満になるまで、一度に 1 秒ずつ単純にスリープし57
ます。言い換えれば、次の分に入るときです。
ゼロ秒を検出しようとするのではなく、このようにすることで、1 分を逃す可能性も回避できます。
また、ロールオーバーにできるだけ近づけたい場合は、 を に置き換えることができsleep (1)
ますpass
。そうすれば、最大で 60 秒中 3 秒 (平均 5%) の間、フル CPU のうなり声で実行し、可能な限り分単位のロールオーバーに近づけることができます。
その小さな変更を実行すると、次のようになります。
2012-08-25 05:48:00.000003
2012-08-25 05:49:00.000003
2012-08-25 05:50:00.000003
2012-08-25 05:51:00.000004
2012-08-25 05:52:00.000004
2012-08-25 05:53:00.000004
2012-08-25 05:54:00.000003
2012-08-25 05:55:00.000004