我在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
开始完美运行。
到底是怎么回事?