使用 datetimenow 等待 Python 3 中的函数执行?

Awaiting execution of a function in Python 3 by using datetimenow?

我正在研究 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.

中指定的分钟数,但此代码似乎一直在循环

您需要做的是指定您希望平等的精确程度。 为此,您将指定一个可以接受的时间范围 "equal"。有关如何执行此操作的示例,请参见 this SO post。 你最终会得到像

这样直接的东西
if min_future_time < timenow and timenow < max_future_time:
  # Do something.

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


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

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

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

第二个问题是,如果 now2018-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可以提前return,所以你仍然需要一个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 而不是(非常接近)第二秒醒来的可能性要小得多。这对你的使用来说可能无关紧要,但如果重要的话,秒醒肯定是你想要的。