Pythonで非常に奇妙な状況に遭遇しました。
while True:
常にリアルタイムデータを取得するスクリプトにループがあります。データは営業時間中に取得することのみを目的としているため、。というモジュールにヘルパー関数がありますlib/date.py
。
これは機能です:
def isTime(utc_now=datetime.datetime.utcnow()):
'''
9:00 AM UTC - 5:00 PM UTC Mon - Fri.
The parameter utc_now can be used to specify a specific
datetime to be checked instead of the utcnow().
'''
week_day = utc_now.weekday()
# no good on Saturdays and Sundays
if 5 == week_day or 6 == week_day:
return False
now_int = (utc_now.hour * 60) + utc_now.minute
if (17 * 60) >= now_int >= (9 * 60):
return True
return False
時間をチェックする方法はやり過ぎだと思いますが、これは私の関数の単純化されたバージョンです。私の実際の機能には、上記を必要とする一連のタイムゾーン変換も含まれています。
これは私のメインスクリプトです(簡略化):
def main():
while True:
do_ten_seconds()
def do_ten_seconds():
log.info("alive")
for i in xrange(10):
if isTime():
log.info("its time")
# do data grabbing
sleep(1)
これは平日は完璧に機能し、毎週夜に停止して翌朝継続します。ただし、週末には、長い休憩から「回復」しません。言い換えれば、月曜日の朝isTime
に戻ることはありません。True
ログを確認したところ、スクリプトは10秒ごとに「生きている」と出力しますが、データ取得部分は発生しません(「その時間」は出力されません)。したがって、私はこの手段isTime
が戻っていると仮定していFalse
ます。
関数が週末に頻繁に呼び出さFalse
れ、連続して何度も返されるため、Pythonは結果をキャッシュし、それから回復することはありませんか?
isTime
メインスクリプトが障害のあるモードで実行されているときに同じコードインスタンスを生成するとFalse
、新しいインスタンスが取得True
されisTime
、完全に機能し始めます。
何が起こっている?