0

以前にも似たような質問をしたことがありますが、今回は少し違います。私には、次のコードが機能するはずです。

import datetime
# run infinitly
while(True):

  done = False

  while(not done):
    #
    #main program
    #


    #stopping condition
      if currenttime == '103000':
        done = True

  #continue with rest of program

ただし、午前 10:30:00 になると、プログラムの残りの部分は続行されません。

私が知っている次のプログラムは(ラズベリーパイで)動作します:

import datetime
done = False
while not done:
    currenttime = datetime.datetime.now().strftime('%H%M%S')
    if currenttime != '103000':
        print currenttime
    if currenttime == '103000':
        done = True
print 'It is 10:30:00am, the program is done.'

その最初の例で私がしたことは、私にとって論理的に意味がありました。そのループを終了して残りを続行しない理由を誰かが知っていますか?

4

4 に答える 4

1

ループが利用可能な毎秒ごとに 1 回反復されることは保証されないことに注意してください。システムに負荷がかかるほど、ループが 1 秒スキップする可能性が高くなり、これが終了基準になる可能性があります。時刻の同期や夏時間の問題などにより、秒がスキップされる場合もあります。

忙しい待機ループの代わりに、timedelta を秒単位で事前に計算してから、その秒数だけスリープすることができます。

利点:

  • マシン上の他のプロセスが代わりに使用できる計算能力を節約できます。
  • おそらく、ハードウェアの寿命が延びます。
  • これにより、エネルギー効率も向上します。

例:

import datetime
import time
def wait_until_datetime(target_datetime):
    td = target_datetime - datetime.datetime.now()
    seconds_to_sleep = td.total_seconds()
    if seconds_to_sleep > 0:
        time.sleep(seconds_to_sleep)

target_datetime = datetime.datetime(2025, 1, 1)
wait_until_datetime(target_datetime)
print "Happy New Year 2025!"

システムの日付と時刻の設定が任意に変更されるため、これでも目的の動作が得られない可能性があることに注意してください。おそらく、特定のコマンドを特定の時間に実行するには、まったく別の戦略を採用するのが最善でしょう。cron ジョブを使用して目的の動作を実装することを検討しましたか? (プロセスにシグナルを送信して、それを発行してループをキャンセルすることができます...)

于 2013-06-28T17:11:48.757 に答える
0
import datetime
done = False
while True:
    currenttime = datetime.datetime.now().strftime('%H%M%S')
    if currenttime >= '103000':
        break
    print currenttime
print 'It is 10:30:00am, the program is done.'

ブレークを使用できない場合:

import datetime
done = False
while not done:
    currenttime = datetime.datetime.now().strftime('%H%M%S')
    if currenttime >= '103000':
        done = True
    else:
        print currenttime
print 'It is 10:30:00am, the program is done.'
于 2013-06-28T18:19:44.937 に答える