首页 > 解决方案 > 等待使用 datetimenow 在 Python 3 中执行函数?

问题描述

我正在修补,datetimenow()我想知道当有 2 个日期(现在未来日期)时,你会如何“安排”一个函数的执行?

基本上我想在日期(和时间)不同时保持编程运行,但是当它是时,调用一些函数。

我的意思是:

from time import sleep
import time
import datetime
timenow = datetime.datetime.now()

future = datetime.datetime(2018, 8, 19, 15,28)



while timenow != future:
    sleep(1.0)
if timenow == future:
    '''calling some function'''

结果:

尽管指定future的分钟数等于timenow.

标签: pythonpython-3.xdatetimeexecution

解决方案


您在这里有两个不同的问题,您需要同时解决这两个问题。


第一个问题是您永远不会timenow在循环中更新。无论您的程序何时开始,这就是timenow永远的价值。

要解决这个问题,您需要每次通过循环更新它:

while timenow != future:
    sleep(1.0)
    timenow = datetime.datetime.now()

第二个问题是,如果now是,比如说,2018-08-19 15:27:59.123456,那不等于2018-08-19 15:28:00.000000。而一秒钟后,2018-08-19 15:28:00.131313 也不等于2018-08-19 15:28:00.000000。当您每秒只检查一次时,您碰巧达到那微秒的机会大约有百万分之一。

要解决这个问题,只需使用<而不是!=

while timenow < future:
    sleep(1.0)
    timenow = datetime.datetime.now()

现在,2018-08-19 15:27:59.123456比您等待的时间还短——但2018-08-19 15:28:00.131313事实并非如此。所以,你不要错过它。


当我们这样做时:

根本不需要那种if说法。你只是在测试相反的while条件。但是你能到达这里的唯一方法是while条件为假,所以相反的条件总是为真,那么为什么还要检查它呢?

此外,如果您唯一使用timenow的是该检查,您甚至不需要将其粘贴在变量中;直接打电话就行了now()

所以:

from time import sleep
import datetime

future = datetime.datetime(2018, 8, 19, 15,28)

while datetime.datetime.now() < future:
    sleep(1.0)
'''calling some function'''

同时,真的没有理由一次睡一秒钟。为什么不只睡一次,直到future?在某些版本的 Python 中,sleep可以提前返回,所以你仍然需要一个while循环,但你仍然可以这样做:

from time import sleep
import datetime

future = datetime.datetime(2018, 8, 19, 15,28)

while datetime.datetime.now() < future:
    sleep((future - datetime.datetime.now()).total_seconds())
'''calling some function'''

大多数情况下,它只会睡一次——有时可能是两到三次——而不是一遍又一遍,所以它不会阻止你的笔记本电脑进入低功耗模式。

此外,它会在第二次醒来2018-08-19 15:28:00.987654而不是(非常接近)第二次醒来的可能性要小得多。这对您的使用可能无关紧要,但如果它确实重要,那么在第二个醒来肯定是您想要的。


推荐阅读