我试图在循环完成后在无限循环内发送文件。除了发送文件的触发器外,一切正常。当我在循环中时,如何检查午夜是否过去了?
from datetime import date
while(True):
stamp = date.today()
for site in siteList:
# Long series of url requests and data processing
check = date.today()
if stamp != check: # <--- This doesn't work I don't know why
# Send today's file
答案 0 :(得分:0)
据我所知,你的代码应该可行。也许问题出在其他地方。
您是否尝试过打印stamp
和check
,以便查看正在使用的值?
您的时区设置正确吗?
答案 1 :(得分:0)
这很脆弱,会给你带来麻烦。如果您的处理实际上跨越午夜,那么这将触发的唯一方法就是这样。这是因为您更新了每个循环的检查日期以及原始日期。
如果您致力于此,请将外部的值设置为循环,然后在if块中更新它,这样您的发送文件功能将始终每天触发一次。
然而,在一台机器上启动一个脚本并让它在没有监督的情况下长时间运行只会导致心痛。你需要某种工作处理器 - 我要么让我的webapp工作队列触发周期性任务,要么我的Jenkins服务器真的在外部运行它 - 在任何一种情况下我都可以看到某个地方,看看什么时候运行如果出现问题,请立即通知。
答案 2 :(得分:0)
当我在循环中时,如何检查午夜是否过去了?
如果您的意思是内部循环,您的代码已经执行了:date.today()
仅返回日期,即除非在内循环期间结束日期; stamp
和check
始终是平等的。
如果您的意思是外部循环,则将stamp = date.today()
移到外部循环之外,并仅在执行触发器时更新stamp
,即stamp != check
。顺便说一句,您应该使用更好的名称,例如last_date
和today
。您最初可以设置last_date = None
,以便在第一次传递时触发执行。
我想让它在内循环完成后每天做一次
from datetime import date
last_date = None
while True: # outer loop
for site in siteList: # inner loop
"hours long computations here"
today = date.today()
if last_date is None or last_date < today:
last_date = today # jobs are executed on different days
"send today's file here"
通常,将调度任务的代码与定义任务本身的代码分开是更加灵活,例如,您可以创建一个cron作业,每天运行一次。您可以使用锁定来等待内部循环完成并避免并行运行多个作业(cron doesn't protect against it)。如果上一份工作超过一天,可能会在同一天发生两份工作。