わかりやすくするために、この回答でいくつかの提案をまとめます。まず、私の推測では、この問題は実際には Kos が説明しているものであり、予想よりも頻繁に発生していると思います。を 2 回呼び出すtime.strftime
(実際には 4 回、そのうちの 2 回は印刷用です) ということは、内部で を 2 回 (4 回) 呼び出していることを意味しtime.localtime
、30 秒ごとにチェックしているため、正確な分に非常に近い場合、妥当な頻度で 10:00 時間にまたがる値になります。これは私がそれを修正する方法です:
while True:
t = time.localtime()
if t[3:5] == (9, 0): # Compare (hour, day) numerically
print time.strftime("Starting at: %H:%M", t)
worker1.startThread()
worker2.startThread()
time.sleep(get_nap_length())
else:
time.sleep(59) # No need to sleep less than this, even being paranoid.
def get_nap_length():
'''Returns approximate number of seconds before 9:00am tomorrow.
Probably implementing this would be easiest with the datetime module.'''
get_nap_length
実装は気が向いたら任せます。安全のために、明日の午前8時58分までの秒数のようなものを返すようにします。これを実装すると、ループを通過する「無駄な」回数が減るため、何らかの形で失火する可能性が減ります。これを実装しない場合else
は、上記で提供したコードからworker1
も削除する必要があることに注意してくださいworker2
。
最後に、システム スケジューラに注目することは間違いなく価値があります。なぜなら、人々が言っているように、OS に処理を任せたほうがよいからです。Windows では、ネイティブ機能 (管理ツールの下のタスク スケジューラ) により、スケジュールされたタスクがかなり簡単になります。*nix についてはわかりませんが、それほど悪くはないと思います。