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