2015-12-02 34 views
-1

我试图在循环完成时发送文件,而在无限循环内。除了发送文件的触发器之外,一切正常。我如何检查午夜是否在循环中过去?Python日期翻转

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

导入日期?那是什么?你自己的模块? date.today()返回什么? – Ale

+0

完美检查:你有没有在无限循环内实例化'check'?你难道不知道它曾经是哪一天吗? –

+0

woops你的权利它是datetime的日期,这是一个打字错误,它在代码中是正确的。 – svalle

回答

0

就我所见,您的代码应该可以工作。也许问题在别处。

您是否尝试过打印stampcheck,以便您可以查看正在使用的值?

您的时区设置是否正确?

+0

时区是UTC,邮票用作时间戳并按预期输出。即使在小时长循环后分配,始终检查等于邮票。 – svalle

+0

当你打印'邮票'和'检查'他们是一样的吗?他们是早日还是晚日?你是在分配后立即印刷它们,还是以后印刷它们? –

0

这是脆弱的,并会导致你的问题。如果你的处理实际上是跨越午夜的话,唯一的办法就是开火。这是因为您每个循环都会更新您的支票日期以及您的原始日期。

如果您对此承诺,请在之外设置戳的值,然后在您的if块中更新它,以便您的发送文件功能将始终每天触发一次。

但是,在一台机器上启动一个脚本,并在没有监督的情况下长时间运行脚本,会导致心痛。您需要某种工作处理器 - 我要么让我的webapp的工作队列触发周期性任务,要么是真的是外部工作,我让我的Jenkins服务器运行它 - 无论是哪种情况,我都可以在某处查找并查看最后一次运行并收到通知如果出现问题。

+0

邮票是用来标记一个文件,检查是看是否是时候发送该文件了。这适用于AWS实例,并具有与其关联的警报。 – svalle

+0

正确 - 如果内部循环需要4个小时,您希望内部循环每次执行6次_different_值用于'stamp' ...但仅将其中一个发送给目标? –

0

如何检查午夜是否在循环中通过?

您的代码已经这样做,如果你指的是内部循环:date.today()只返回日期,即除非一天内循环时结束; stampcheck总是相等的。

如果您的意思是外环,则在外环之外移动stamp = date.today(),并且仅在触发器被执行时更新stamp,即如果stamp != check。顺便说一句,你应该使用更好的名字,如last_datetoday。您最初可以设置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)。如果以前的工作超过一天,两个工作可能会在同一天发生。